From 6184d645d21c1c084c355c18efecc3e7ac8bc389 Mon Sep 17 00:00:00 2001 From: Krzysztof Dajka Date: Wed, 4 Dec 2024 21:42:34 +0100 Subject: [PATCH 01/87] NEW: proxmox example --- examples/media/kanidm_proxmox.png | Bin 0 -> 72223 bytes examples/proxmox.md | 91 ++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 examples/media/kanidm_proxmox.png create mode 100644 examples/proxmox.md diff --git a/examples/media/kanidm_proxmox.png b/examples/media/kanidm_proxmox.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e2687bb7db3573b01a7084643dbb5fdb02d897 GIT binary patch literal 72223 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

Kuha7p~U{(nwHHQqPwI@r;fBK3DHUGU@ z_ATyddxqAW6H_%BK8k&tgd5DQ0=br9i#T$>>tc@q3Y|(@DkA(Um>jypU_a$lq^t54 zSFfezYq*sDAn{92?`_`FFIlwJv$5oFiV5Adm?OXT>zbD|L#Nz;VlH42ei9Gbqj%i4 zP`N(BbwH}I=smU$BdADX&?D1Mc`KEBSWA$Mzyy-=1VJg12sx!HZ-?2B3^X<^?>If}F z4N@C>e4Nd6J8FD7<}??we2iJnKBs%sq0Hnd6a&Ls3r8*fkcqkJ`g!nuN6euO(@5I) zA9G`!O4}~kdwkP_0^A`g1C%XKW%j?b^|{nOBK}b6^^mYWnGWQz3hQ- z+M4-uJ5T+bLtk9%`k3};t@poWq{Wm}n|n~2e*CI`IaFni!qM^m86J`J(BdoT;ePBl zHfG=VNue%=iucRd%BTgK;xej-T@8l_^fL`ysVmldiawArq9kz;7(All<&4ilfyeS9 zktE`GVxN9yRwhGYbd3~$RzDGjY(vszG?-}+M1(75^BMPXo*J$r&n^UC?4Zk@F)=-* zIZ>f3Oj1omM2|T%8ixP}r#-Q=g5Go^!d>S6Q3A_i)Nkr&nwP9g{`U)2EnFMbQ&eq+ z`a(t?WW4oz94ezHafc1##)EX~JV^XUt$|Aa>k9NtQkoslV3vL=; zL=$5Mh5bXxCH>$KNy_U+?IHsw4&%#@ieWwlAw?{Gx?wL8=l^`dUNu%2sUUSJOw>tx z|5gT954ld`@!amN*@v|EU-X`>rk(7J)=isC^)hWF&+5N$7Qt3P{_>dkq^sSeav|>TR zFv8ph;Q)w<8ObOsg)hhO&*ALf1DO5U|9 z%z0slnZ&|kv`Vm3UCr<+cj8j*iD)E6`JCWfa~ADTq9EJil*Y|YpVC{&VSy@DE(Il4 ztj?{CWiq6tq0~YMnN+KEd+fCt;cJuuy|Bd2ocx`vCnz=w<+;8ix36+)vc9HtXJ@hW zwV}lp!oKUS6ZKexbH=afUU2#qV%5vhqi%)C*Y2rHz#&3AxnHvHM)>xw18r{z~^p?jl){ zJ$gOZZEx%8gp*l6_mJ6)m{c2)%1v>Ps@0%2s{L(sSWo^=Uxf+Bo=)LRi8IGQ+WRs0 zncVSRhL8w(<6)f;dSx_DzHBC>lHRoJ&xe3rI zwp}@Lo%6Glm;O%eDNEwGkwe&iU&(Mi(KQPei^SnwFfzK0?LIm6$o%YMlfQSWEjis< ziq=T?jH3~Khk7B!+K(fr{Xz6dsWa=lGM@%s<;*mxB>Lg?SC#|m?vO(ZnGi$$NFa5jgR z#|==FOZ8P^ELkCrM46Ve22-w$B=D zHtB00@Rwxdmj;HCsRg+hpbhjm#>p$cl5~>0G9XLJRqk_Uf{#7QEv}4m^8C{C=TfAu zPH{;?PpkfFh6XGjn%3w(P{dU3c5N9>z$*a?S~4;+5b!vDf|^56i*s|c5dlQKPjq@1 z>*QauzBQU~C=5OY%hzQYMb&$9PIUbEK)au78q8m9ohd$$-EF4A%};R2I$$TSA@>5! zkcn9)KsCdlD}ul%s-vUj&(VcEr?)tNC0kF4A9@_7ql8l zW;$6owHmgcXX`j}{$?M#`WBVO1Lvw?s_;ki%8%IXDq5I)u*=vg7@Y9?T|dRNy*(GG zc^C}r*=kcfAXXrhke}#g%ZYDIk(79q&ZL8fFEx1KLi!mBha@+0)p!?4)Z)YCj){g% zk#78TM8ERNf_JwazRi_m(|70r{n(}`38^>6qPdY(W)uVDjSM?ULF!HZWYL%D<9c_u zT(Mn;Is>Ig3ZGdM>SeLVpzbO}bp^?pt$?802)7}c_`Qf<45^GPl_Te+F{RdY(5uL8RGA`GQ+T>Ggua5z}Nsj{$*w^g`!FY|w!7Un&yU7}(B9DMkLAj1R3JU$8v!1WXCl zR_?CdqK9e@<)&Tk)0ri9H-T3mIi2So9YMt#Muk3rgzAaW>B{tj_RBUST zug_xj2q}-J!r_X+Sn5`G!pKNyfa@fa1cjt1CUrM0)c)}q+NVPqpUaL@6ii3eEAt1O z@sx4R0MxF|2~3QV$*{*b9v`MX5ZV;bL+CWX$_$hj(xoK(PJ9nz_1 z(Z^;WH`fuFDrm6#U46auv}_wSGhlV)y{igu(ZG8QoY*N2%SCzVuc;N{`5TT`anLak zd%n>S5sTQ3?04Z8K_T}@sCMJKrraX8?4rO-A-L=Z(U-JHiK+-#ZtsgCh{(G{CsaOZ zbx&`7>|ZeO+rPpT4F% z@+w;$Dk?Lh%LIB3;g#C%FFExc?30tSOM7JvWsvMKeW8!Y=6jr%6B+Pd^=`&&Z8b;sJc}s~;);}S$_a&*C_Bge>Nsbt#fzS2*oHYBgnh3} zITiK--$Z;^KhlXe%!$TaX{%WrIhUWnU0WZ3{ivu!$q4(th8mZV-z{KC zYkETekw119Ud*f8eeM(0H?Kt>9aY&{cHC{j_x)aOx9P;NJ}>rNs}G%V%30Of7B0bl zE8O){aa3$$?kJ$dUt)kwOR2T+61%A&p_j&1+$(EGwZ$Bh7sLv+QKD*O280&Gv`?^l zC$r^Kn#CBs{jfL){-v0c2Z0ktKYxr$s_qsa8$>o2Aqu@xK5(rKQ>mEJh?=~q!na3u z|5cp9T~VP^^p|x>r+Z%agZZyQ6Jv3G8F{B-UU7AY zRLrVyq#{tcaxXJ;X3-qCqTM-G_0)V&?RKlQ+)CGivG_Qn{igey(ZR%-N%j1Pj?oyD z`62x#U7a&|atY1hx+a)~k=e3uPD+bP0LNgPvO;yayD$M36oC;DI|pU0+dw@B^+AV9(Z+Fr_1}|oAP9u{S?GO7rtPb!`N;*1n28N%n3Eh7ZKAi*re>Urz6CHpT z-P3;xJWdX4KHfaJN|Rj^4x>{Dz+r7yr5*l*JX@}V8%xe^?BHuQg_14em-u6i>oDNj zF0(tVN{63YqT%(1fb@gVDTic@yz&G>U4`12N-KFl^V1<)uugo>XKUS=By(wam>oDvy=yda$R99sae($orm2 zLidG?={gVRtzubv{_qrU+b9A#aCQj_Db=^JK!dkquh?tF9KSH-n%nv$`BB>V4gTbk zhV2NBtrP2y9oTgnwYfW0HZn)+6qYK(X6y~Lf{Oz0r}YbEs#~7~YHkK5KZR(&MWrES zja9Cem>BwT0u8>Sv zr5VR^o}}@Lg6wd|HB%c0io{Qn7%pX&8C@G4ThN($ff>Hu*Tr?}Y!b_T%^VD9aprC_ zaK$bMK{fCPSm*E5so5f;RqBHZ}K$+8MlIQ-B>3uMY;9~CG zqenRalUG-@L5ba5trg*0Kkxo%3cDE%r*|kQpY-%dfNj@KR}fk#9%ocEg{+*GmaP6J zM)-OhhwbJYa3uE_H#u{mU|;~BlDy+PiL#ji0HS&HA1*nqgpC;s=g56kQwtd~6e>^v z3fsNI!!BbM)cK;MUsI-AoBg2Np1>awS5#enF>ErrPM%7X;d~FB&1y*JR)*r02m`Ur z3wXlu%nd5c$=0D7rP!#M3{kT{Bg1(qQOfV1cNn%V*lacD;WJL9fM%g9qm;NB4fE%6 z@<=1DQbksG7?=I4=u`;`G8~R2FEJ7V*&UTLMyrvG@_sl0F8^+_$g2k_QS}2<(aSf6 zbn&8>4Ho84q~S(F-!b7`=vD3p4V_t{zg1~_2@qhQG4&_gnDmOEX5}voiCdD4NDL_C-tMPTx z+~X3UbKy>L>1D3yuA@97t+I5U8OQT;D}P$8KN1k3W8?{=Rl^liixr;K#d?|*jG~Cu z)aiLro=fCJKG!oKeeMujFIrH!mV@0x%POz=uCuPLd7s8gT12By+n;&4_pH|~jEJN7 z^IQSitClomGn1_NzE^IXFq~K|>$8=V&T_JFWrUV1Vlv?*EID%7x`;g1x70N$jR&NK zSey*mq>}A@8&fE^cPj9e42fpS*X5B0N$g`6>agPew{^s!*?iAP2LuyY6af}j_L}ZY zu?XB@QQQRGOngH*tC(^JaJN)J+6MPe>DS&4z=Pe zj7Z{6h817$B}AZHCc{e)>dR>@^*8iha6FXwcqOgaL2TK8brR6A1NWf2r-mg= z^48t9Ml*y$3HhJY=x3T3LNOS-f0Z-|PGsz+<@tu%oZD*@Ft7^Anh_wMfQ$v5{A zxaVp>S%BLS5SStGtSl`J2WCB}czB@_ImC2y;lPNBi@VX%{yh$kgt9Ugl#Y(htJkmf zYPFi;*OuLmMRMfc;o$tya9Wz8aQqLRK9jeyf?BOg3uwUf^beD!tiVR2tEWeo1;+#1 z9TXz3t*wE53*vdgp#7;8Ua@Ejfct;|pi7ztuCu)xM3j_o0Qm;u#;vXQ^aO9-yg4EB zi6hT2t!|J_Fum-4@{q_GFMFl*FX{k}faU0-*YhJ3 z#Gn>D0~9p0PCzXIM>+%op1Kv7*WkYh2tf79qrsBO!Tvsn=L1K7e?K5nn855HCT{34 zzIJT}l^VZQX#p_`OiZ{^z>DdIC+d=pIx{4pV&@KANT7~%h+$>temkaj!4zzjF_vQR zj4BwIl(%wJEEIqQlMWRBkjIIN+5vRpb-*METnf-{DA?HI#>SKY$ouf&!*`ud|J&-5 zx;l=QyZw*hc$~m;;XSB>0hpeghQ<(>|B|0RL4nI{0hcJCO$YA^xE^k`{dn2J1nQ81 zc`TTf#fl$OQc_xc<^S_gYKvB4`@pdz8bL4wh5)QH5OCQ-0hPJ(i5!qtySv7af*jy0 z2nPq}sr8*pyA6uK{Y2p3hQ?IjTE4!%44}NG)GhS|$>(rjF#=fU;NA^^youAcm&iA< zjMl54K0mxFWNr<79qg)%TCq;bE5Q-OL4gTHLbG=a~l{Ef{Hpom9@kOUwfvtF~Rgj(>05{u8B11v`H>QM3VhrnFyhJ1l2608aBw(l=m zUO4Des)ICTv$3u@0K!6bT~9eI?THsCXio3P{rq`S0!#W2JGDOT0KZ6g(>ZuMS_jOcrBm9!F6vuX1>O#bW5NCf<~P^|{%<6f zYmXBc-p>lnQo$&((`H)`FaXU2gzE!&x#cy0d%<4#dfb==+*YPy5gY=-1+P+pLW^Bj zDydw7f&{8dN;Y@VKcjooDvnC^U;G+`ef#$hCrPA{|B!b?59H$6|9^kIz|s*445td8 z%YN4|;6s-KHoxb?zurO@zEqSLk?$v&Kiz+YJTD-FuKJ(UTH{)5A25gkG-mjiG32GM z=!(shRaeKXuC6BG`1~`VMYsnUVs38k+w~CoH%Lf^C#&s%&wB}>pJnp03JZgQ(-j&f zrlZCSupohrE5spp<1~HB6q`x^4I?8XSl<`-x4@fiVsy047Y+>y;;RE}LY^IZ|MSK& zy*w!*!M>1{k?{hmXlmc>xu~pV9ehErf|(+f!i5p@r&X68cn<-)P@sR1if4EcCMpD6 zQGvAx3me-RnDiHF!1WmTbKhz9_V$8_ynbv7_s{j~kig}~#>SGl9NtFs+D*CmBVeyP zLBoN0-<>YtQwL0LJdRCRa4uYVy?{+}`J6cx0xZOMTtNXHnA(B)0`eUOoG_61fcp~# zrgadN05b0d2n{h>V*9`W1q2wt^iLpbjKOr0l9+_#M=9oj+fjW0@TLRX-sqk^SWieX z5+Y#80my{gU>7lF!2yn_kO*=6+Vx)}UEF80Ty$PaQ)zNObwUY3S$Et}>e;d9;`DlI zD(jXlnqu;Na6W1{pffc!<*-?QH9AGTYs~?!{pcw27X+V{wahl_T?4r=FffeHC)$t= z3jy{e)XqrS4me3)t)7qY=jG=5zatTa4D!(N-k>BFn7g`zf=I}L*z)QEJnUC6FyPR5 zYwytQv6~S9PSsz)6&<92kg*~W@=4j-vw$ZF6c$y$?7bLhp^Ex5*?kL5Z5~>>X_iNmb+l!0tngWf16B@{%DG>qcs=v z@;6G|yH^IhrTNV{T=Gi!%{G4-*&}~Qs}1LR*`^qqc*Z$ZohwDCRqbGdIssftyJBx` z9S_mNc2898FQf4pIp-rTzG)Y4i?Z!6vnMGqjvg%nJT=IQkx%oQiS#Zjx2LY-TFdPP z!&YR1fM_qdokHCkfnuML1iLKCDe_+Bf3yH7z+v_PqfEyf_})cpU&*Y45aOORUTJ)J z*>f(iq`kcz)Hd;LT|iFS>fg)Y)Wib@h``Ys5bsKW$C_t#l{jdl|-TUi~BNIP5RuEuLRG(-#F_gT3+ft zs5Q>^_qw@*-2uxTcy*9XI7BOt0jyGfFnzA8MF~Jr=Fguf;JgLKMjR;`7S!Ogg+G73 zZwS#05zNpYO&0)1B9rlGI^P7C@EmsA2-izaX~)gW{kao+hqVS@vc}Y>iTCZf%I44J zIu9;E%68Jmv!Xt-WVc>Yz^~Da_QD zvC+_I<6NH8my2of6_e}}#lZ&K>nynlUpM&be&n<&MaQQ2i`&j7b$%1E+()RqG@EU9 zp<@guuGCT%x75L?!33UtI&)qYy8Xh4;kAYg+q@+3LK2LG6>G*}L|aqRn>_DcI=~dG zYwOI-3Cn#0)T1QDqXRPqZ>P8m^^29r12B&YFv*`S&~n^LW)oRRTYiU6M$hScDf?ZT zy(}7)5j>~`w?-CeieBlGp*7O zd;FLkYA%OXj)IotLv~7$m{xf=&9#h#JR)`hv4M4@h9ha>O-OD1L7DC~$EB+Z%*I*L zgUS2>q(X?dAJ1);-^&dBz?tM1qd2$0$57%PcAT$xAWFl(H!bI0LeXtw(IbK`y8ohZA(8=NSGnJa2Gk_dBI$KN2Fd0 z%6ja!lG8K@LLd;$kSMSsqMa z1~N$GX3gV90@T%;Q;0+k%sL6+sS6^pzp5|%ysxgV22{yGHSz7;K^Z4-9|vI-*rp+2 zm4d<~tKQo;Z_+a}p^K*G^BOIV6(wybZ1tXX=`nWfg;%m(E+*f62pF1*9P~8diILJR_@@Hy%#Nab1U4tOi#NnbYKOt9FK>N5 zC9$;7Rf!LCNs6h;uJ3jWk2u0YuUCLVJIh*#;GUI=#)~%Kl72|osDGoDP~#BBVZAPz z>iL(*b_bQPa!sTb+CazDL4W@+sYqkmgNE(kd%?xKha;(PN=i;ckt!JniG6Oz%`?Zo zl0{R%II0V%Hve5&yx^49H#3P2gBusj99y0CkDCcvgKN{YJb?H5I@wA56y8w6|Z9MSNNPR-)NI+CR#Ej zSb|2OKHV%~!4Sz(d9bu={BnPuBdTEphd7JGn$WxlZr8q(A?*HRN$c)_UXJz}Ld{Ih zSGixJp>ID4ofUPXo9Qwbt8>V3jr#hJyY~Hf`3BazH<#&HhZpKDAWzqvs%?5l_4DiP z>%lG>8gh%@unbXG17uCNI%C}`3egGozuqCHW1EqZXUDkMxi<5u`Kj|!wICjCbRSwV zSA5WfHx|G9@uQjWxc6z4J^l4Q>^v3QuhUXqjj+%mJng~*cj+9}D;V&PhDY*iSSFLd_<#ZeLMN97$!nkgvi zlH-TZp5I$UoFynLDD-%0QvPlYFi0Qn%N$oGs@&Sr8HT)kq(p#WJ}R z=&hvm91k)0Y^z@wE)FGIP3Y`;7z{w+uk9Nqsx7j3{T0P6Y2=`#^w#P8F>Lo8N29OX zY^=;7nJhc@@%XQ{RSdo$F@tcSO_qPS_K^Cw-T z9cq8>XPbU*59iWl5ifvGuxKD92XR#QO^PrqNGR&l^t81<04T>dARuezpe(T%&c;nH zYgz>59g?r?+8kN=lM-$poa*pdZ$O5k=@{Z@|aa!cT?tW{e!oJbYurw z{uwZd{F<`e6zp~$UF@0S21Bpa7(h@@^89P4I8#ch5OtbHIp}Y_t|{NXDfaJ2OW1{# zhE#7MM&a)z!?3)2hCYbBIVpVlPz0wMW)si5Zp-%ak!juGyqJbPi4An$ zZLTFslVy^XBuJ;YU}0G&+=mgJoCpb9YwU(gNa%#a9KYij$unR4wyOCif8)irE=RX_ zYFDyxxMWF#dp^6snY8sBDJ+a)?fSZ?(6kigCz3`WPG>}H)gSgRKa;kZhfrKyDs$oS z-|Uzt+X?v|$MLWuB07$eWpqlPC!7mE?W)9%Ks!yqU0FWTCau(>@CyaVm=SOBr-HS? zdMU$Q!$u1WqfDm~`yUz)dFT6tOn2G}DZSTgy<@FU$y)F6;E1}0Y&rw-KNGn4?oH$k zXfv-5TVJDN^1Taq%wnIjSwsxxAiyi@IRm?Y;v(1+FA1ls_FD%h>lQf{K4FYcb?ox# z>3kl81Nrxn6%&j51RPB)no?7#ocoOTm@!Md=Ae#_B-`FWQQJn_Sf)VMOx6o^3V0x* zBt99vJPG-SA@EiYd8t}#?m-rZYNCqnWpFieC5O)!l+A(9r7=PRbR7)s@7?BB5at7| zCoeItX1Hu>lXZ_vA7|Z5JWVIxQd}`RCU>2#a?C#eNZ2Q5|2;>!tk?(V12=)fY6Ev# zhwS-DCk%}%C3&{`rCm(b%qPR8Qio)RMjNgrz)Rr@&oDV2^-ho3CI7{UQ2ReIQc86& zfmbcBgAQh8pSA_5W#-G-lQY*h+|T&!(AbFxXuq6)CE&d6o}K@MpDC0FYw;8F5(O>y z#B}gjrM&jVuzWnbe#KSu{>SC%ewEu7xNPQ~jj8>JFBAu)_)JC!Ha{eea zzM_hlC%4SRNUDvqS6Bq`MhS#*AdXI>FeS57cLx1UZ& z$3Tsm!=g|8Z>#cad0g=cBPOHuq{Ew$t-~)k47^-HH~UAi{30xR((g7OJux_GidiW0_Z5Tl0tEKOTu@Vc+{41SL z*N@FTi7fq7)sPAJ+~eEYJ^}a^z|Ji@0Bw$ufIxT!3YlLhfzBFWF6m$F9mWr_7nwhN zXgh9{Sv0W>0jL-RdOH2PP-n9NL5OT{qyDX~UPmG=2^I{*CDZfz4`}lL2~YL20@zAm zCNS<_;8ms<1kpNjwrza%uZutbPk`zFsonlJ{`kL1)umyl-w7_B>gy}oG)A_kcd?W8 z@`CR+mP+mX^PLf(ONi)P10KkLdIOIbWD6`f zh(tt0py(06GT>o6(CK0RgRj{{-^2)mhYOB=+inwJObfc-09wEp^qK(dA1OIG(B9mX zyxKi=27pKY)V@^?&wrpP_Te(pGmvn2zMlmdhNL7s0NEdh7l2JJfW07I+$AMpAb$Zs z3m`zwstqyUzh?$84XE>2Vf^>)0%f`-`1oaz?SeGs?whu?HN#6-gcGx6&{PF97^?^H z6C4s!F2LO&o;i+<*xZgZ5Ep9C7znHaxyX9sjuI+1;31uzom*#wk#JZ70XB<TiV}JnxBL=XRufIPkfTBJL3PSt&`SF~zz1+3uf@lFj zN+&KMAy}XQJYCw~Yq__Bm-qtGl#Y}X1r^o1cOwIs6$9}BO0(w3jFy))01big1N;CU z8a9hD3b32%0*&*4bU}{+3km|IX?a{?fbN1HOsf+?*#?OCv4LZM*mM<&r!_dJgXq*7 zEa4$DB2X<(OMDYxh7f|-v9Wo@r7Vxz3}9m5g|1%gP2hob2^#tV@?sd=SDCUuXbD0@ z^aD%~sGd;lPGGtVnq~mzNfm;eK>?P<1r$e(nO1|%0>C){tpb1-q{|Y3{;!wa=mB3{ zUe1u2nF*#P6tHq<1hp;RK0Yr13cs-t!B5V|N8l&8Hq#Kakb-+3=NJFnlolNAn8-aP zEZobyMNyT2nfG$>aHafL$F3Ap9(TXit=i)GOl6z%hNL;&Tw9?Joc<#Z+}|9ul$>ccGlrn5(rC=dOlT&5xu!pRBvs;YHsN9gz;3o_Sru z#*Uf{iYG}QE}14*V-6l$8a{INxjUkIUcZB5WxU_xASU~Po*9A6|L~LW`KC8+sXYVG zk^GN)vOHI_dhAq8HYAp+PSarK1M4wqUENHp%_(rlqG3290Mh_#5a6A6+e*|ifMEnK zWnjXzFaaR7)R{XH;Obx}lm&l7Ur$3#4c!nm1TF(+mPe4jnOV_s6*wRuTuxwMDVj~$ zOvuFE1+9|%2q&%ieY*ebNvde!q%VX+$+c`>%H-h z&GoFR@oTxf>jI3bRw+(*t@ZlV!c|!PPGI4yrDYb0Y_cC(VWe!1J{Zk_xDK~S(~R6h zLcStcmrY*4v5=r89rK17S*mH7sa^#AL$P!Vwe)NSh zTy$O|<>R72(PyC!{!)@1LTO_jGW}4ucfBj3a%YZIi90o4uR^}mwESvMd>}5Sd)c#R zQhe_~-XDoH7=jk>WsBXtO@{SN@r*#0_@gbFLF-r*IT3!Z9-K1#KzXWzwzD~65k>6J zOVM|VNg?qtNwcXjp#-1|V7+^gXK;&+Wh^NBi8#Oks8)X&or~EL^pucoN=#fMezg1YW0s%%Ph4W_KEtC zM^3e_OjfH$#CXR|sGJ&7DaNJx_QsyfA1n=^czpu|b^MSaf!iVDiUt-~1Pn<-Evdfi zS8GZug91LVI<*U&fQ<*LS#%7HQ_xH-i2vy{0v!|cEUxvz57HtN>@etW{j`=;KyQhl z(9q2R`qnPPsxeTW3OY>zlA}@wn_M0jmYh*R@MmPH+UjM#4L(mFfOl znwz{|ql`+fe%DxqIkA|-lf-j~Ls;{*jws?W5k0mww(~B|Ftcj&bRojE!Ml;uVRG0f zL@Dx;ut+SVL}%gt-lk`W+~e-eq)nB|WhNoq<~OXKUbHcFp=$g$K}L%60IywAR>_R} zf0YGHOudA5!rpGsuTc)3d#ZXB96Lh1@r9T(mR!}$DJo;G;}E7^c`Uk;EkNNwg2_`! zWC}M#*@Y=a+Dv}*=&ZuXa9&d1W1Kn-f%V@%+C7rrNT075N~BrMp9^A&TSwCKa}KhA z;PzV&UN9|pe=_QuBkI9#QQGW_k1`7vtx6~Bd{!jStE~lCqHH~);H`RS*l(amJ zK2HLSq?5d&NP`t?^vvj*gEP1LB27 z$G;u_DqfwdHhT{WDL{z3e0b93&`_|X(i?``3uJ7N`3P+E`~(G@ojIb(rO&ESknp+w zA(kM)2hcI()YZjW^OoE)#qXQ1N8ufN|!TI zASVXhKUbJOhvNm!9OV4|jSj@eGI<+6UK5cy5a0Y))IB*O78_ zMD_php|9(Z(Cg1x=Ho0uO3(Ai@=`CW%Sy%LNeMMosw0Yr1xce0GCO-+Lk*d&Uq2q4=FTf7JA5;HO*lf%{QOfw4!r0WpFSHaqnLl}hOITi z%aRE|;&$X79ZFj!-S z{~r0X0FANmI~3YG4JF-b!Le30y`a?I2JCk?&@CjWDm)t=HaS6>GS zY6$X77`0kZ#=oW|-n4(slK=P%Z0o?M~)4yOEib`waECfCYdcN=!*PG`vv>zN%MACD!)&)!w6?0+D6 zGTk~mZ_|GGn^$Koz9y)Mgy5M9r*p~v%8mc*6{A+R_3EqwaT2m=akXBR&+_P%_|OG= za78^^H+=qaB$rx_$ObjB-q5|URFKi;NR7=E3=~Du#7yU;tQel+idyf5AnL>uQ}|_L z98=}{beuoG)4EaDk?V@n*--d5Oaxh=-XVCj#Z68qe(;U7GK?yKYtOflv#Ep*YyZAs z4TJF=vyCMvFJPLTLNtMxVKY=;^>^-?%bQ_D#pF_&Wi2hihbYo@HO&g$v_tuTnwK_*eFYG`2rp+gbyxqk0em$g1M6sQ$9Hr^v{pz^DmHWO%6 zBPOAhCa&ccKIsY^JB0ZRSj_(7VQaB8)H|PXcv8=|pj;_3Xvoh!joN1`pDWM$yi!wN zBCO_s_#u5x8b(X&B}T8L^*H9MKPCqO|5+ZbwzM zSN-lPmXA~~lqU0L3gHX*q_6x-4*O|gth_>Bn4(XPVkI@k<|2s^m|81kSTXPPFS7J(6Q7)g?o9R!o7Z!R;bCNGDv2Ig&)*L&?e%I=Orr?4;UJJ zwvYlm_Yd$S5F>rDk4}P)*jF%YDuewQSq|?PX8)rFkO>YhzJYzE?$N&fH$*_M+ZD$c zZ$ja#@Yk5g+0si{ySNdfux%6a3e@x9Aa}M}5BWQsFxX^H#p2OlA22ag+E4bH&R=zipRGDf-g=Rk^3-Xc;GVP|Fm{ zQw9z7Ou4-7iKBKdxF$2u#5^7BRvmBLANsa zYN^A$@{^#s7H5M5Uim_Q1JMv>ffHAKYCWH#GA**?o)(>FuF)WFdOaokfi1dRDJo&{ z;_h$oDcz3ky8W1SjWD0KzUf`CJEDm~)$F}HmwL+|_UWbaGgG*<*}^S>LJQWTP<(an&tE<2-QNVp z#9#M>6F9jN+BrEH0h1JbeE&KT3mg{=Ae01T4?u~4z^AFH$=b=OcW4L^U}vB;J;*8n zOmVjAgIvQkHnh~E&-C@nmp0(T3yCKI>LYz1AAFx27j#q6j&2D;Y$c?;KNhnRZ~GoT z`28-s2qkbzQMqeKVsPlE(DU&dH*NC_4*k|oGxsy%5jO8z(WLgr?s-$Md__t}^DQ>; zPeSr-xqCyf(~}OxSD=m|eu1Yj|0w}epmjgQ*nVQ=Nj zJrHq`F|~P>f-imjO3aukcXd0^UuheRG@viv_fj3^kKtbAf6bcO8%@&P^>9Sq(@O5p zgqN@(FKAWka=W+qiy+)?snjMJFbtnx6ID-(dq4)0Q^UKJALRZ4)oq&G5py2OPfn6+ zAX;u#-u8022OLg1$j8O=5{^1lY-&__EzA9d->_$iDHs}VLl5onle>yL{D}63?{FN1KFfWh8Mz7gd$}D58GFR=4=aZ%^ z8hhRo08dm}B260!1rS^l%qc=|I*o=CFh3mavDWDf+`9(VmqcrxNW#c)%_#}E9^4WG zy-b+0gp#;`GL$zSj-E8Vctzr@sDN^pK{ULFXUO*m7T$UHKH<&1J&9zLMbnugv<`b+ zcNV%O*=?NKL0Z1UjT3VBMH+nkC@cl|M&~p1Fr6bO ziQyEQZ0U-2_K__pH?@Vjd_on$3c}$H347*_coXNh$=T15dh6>qhQmTbY9NZfu|vvy zHsNT$v&S6ZaPX0VBAobSM}~z+DB)(CEtc;{vOA!P(JDgwwA}>j8-qo^?lPgN;Zs0> z^EFjM@E3KhV~Rl@SuX4(xmgv<*Yv#YIyQr@1vWk7%TmtdslP9&Xl4yx(|fu0k~5sY zz^_9#+OBdOXU{2L^|`aq=}a}+7W1OCltt&#O-*i#tTv&EPx7Calr{bxBt{6Ivx7e0 zG7P&5OQBtpb6z_YGOL<1IfBLADdlc9z_>>&?!4u~#Aa0Puq7i=gg)u7-H~Zju?jbV zk=N|OSYypTHP?bBu38CyZuMHvxj$~!2sMFCmyir<&Cc0L{M~j!#!ZZOkFoALp?v(* zYZi}X1Nnl4Teyrt`WHfdUvf({Kd(cj^Rf@JoRZQ78QpnZ_a3t%wuqvkrMV^s@^3{Q zWaBSguy(c72j!Fv_2S`+ef{C_=R^h?!2VZ09jX{mDhzw62 zGazS*qtnO)U6c3nGATj-)3v=lNW*6kD^Latf^Q!0uV4QpQ|)5K2Y4Y!TB}n0scgU=+-|y8w2(sW}#D9Cmj2Vt|O1>c~rEn)m z*uuyE*ROOf390^1x}3h(m*4iLf`*sMgG9QmPK;}%?l z@@+xLFa7(ojG6!2iROR55CqWwH=u1nj&=ahGdCuojJlb=Y|3>-L=BtYSwbk88duG; zt>Bv>F^FikPo%!isZSc&rV;X;QlE50V}$*G+4YPWT9^j$fIKEoCZ)lVh#JG=?t+Mv zbh8GA{GZQRKbpuTtpplXA|ZckAVCLp1WOnnUoaLuir2?`tLE-(bw141MG5UOec`AE=h*i z%*^aXVoP>vYAOOYldl(Ooe5DDPnj-YewUb<+|QRQIJvm!nwY3EakH^u1ijgS&~syZ zTNIRN1_cH}fo7n|i;L=@m*uEwHDJRhs?BCFx4eM*&i!&q3FzsuK&qywh^f~TYBJyA zbgT*H%-(bfE-;dU)aU_pAJ~k6m13e-Tq%Ly8I zfVT;-`o+b?UGRheAJM+l{6q`9_*x#$B=0T{0@Bj7k~V-Sza2yk?Ck6Si{}K+Y0|Ci zHuUn8k6b>#`Dt|9B@I)VN61c{3JwQrSuI914ai-RFihdaWYs^Z9+jkw#a0K49N3lD zVuq2$)Sr*{6^yCiz;)7{1YR;6r z;$*F4ZBTKNVN=ZGc^^_b+Z?)Ak#Tct42Q=N?#EqH`%HSxxs~h}_Ay#K*=)Q1{UD9A z9;eAOrE#?k>UwN_W&8>~`nhFWHN2e||MqcX=MGPO>Kx-`^Ooo%QzS>HJzL{(lfc$+)>2*Q1rkoWwS*`zH>>xN7vcA|O}-6bhuzD_DOJ#i!A5 za{JO!3J96l9kNOa3hE21<;z+Zz2y}ZMFG_V9ujaMOWJ7f#6&dks!Q@PTPIMw zyQPk*Rd2hv(ck7n^DUhgT}y3^tkLDXQbJ8YnKw6bBC&Z+g%YTBl*#!ckYv|xHu= zImV|`=3zdAu0+11uW)6k4*K|Lk5ea6w;W`FbfIW=K2 zI>lf7M5#?EB&=GNY3E$M=gv6~k#0Ip?5WB0>ni-yA6$hxwx-naSI<=kU(!RL_0`zv zyu+Rg@DZ%BT3Oz21)bk@Ygg_b|7^ef5fTytc?J~~6$pfU$@%&Dxv`@3^z_NYv9(L^ zZ{OBApAthgyIvAgQwM`(Sv-BmJzavxqWCK|?k`w%dlgHTtvM>X-MoJ+bv8cx`O2_F zGcciM2}HC=GUSRIqUv5M%W956%bAg#`>H1E%7d6a99 z;)>gBwKSMI#*DlffT0nSFc>j`Ib)BiY=$E9A_?(KYcEhO6{qUgpIX@ag^=96_-r2g zi8@D_jfTP|75iKgUQDw&8k+lyT3gS|PNl9_)yl|(n#%7F7?P};WoqAVy_j;U*HqO- z%smazAH5$=4sgUK(ct?zCd}2=Iqt9@M{xv$B$Y)KMK*rO(0C;b<$HSG+}^z78Xvsl zG3s2p<}hq!3i8x=8RSZGFu%pY%pm)KR-bds%&m)BV3gQvKy*81^RVa4iT%tQY%_pd z!Py@1b!6B`A&~G#1Rcry@*|m+Mei9a^zCa~8$l1ems#;C97$gpzxw+7qF#@?IyM^_ zDoF7Q`Uqmj)P=k)RXi2(DAG=EM{aGg8GNdOp-_~|lcu_b1F+l3AIICyFs3|6161ijxO7XLHqG| zAC2V=uIq9~&$CLGdKLD0lW?q6`Io{^^3Ao5Bt@P{Qnus7QO`ysoLkZq+mr82X#XtQ zHDnB);jul95MvIO(A)Jl3^dbaFE^Z1UzO-z3B{>B?|3OIv}R~H1Vk@h+=hm{?H)-N zS*Rw=(wqy$Xmbdij2p@(s29L9>s`CfPq;yln$qij>!;~X@93*iV$0*wI##1 zXV@~h{cLA%aAoww>#G5ggCSmq#^W2X!DTNg;(=lUVo-ajH5WY}BLD<28wYs|6{_i{n=urz!Q_#ZK z9h{Va9sp%LKkj_Tz_tW{A4nBTCMBrQ0B1U2&my zU-`wfIVVEeS{MtmyPr?Ojqqdh&c{A%C{b-HIWjlLYCV z;lf)!2_jnl@BL-86kFGJ*uw;J(}sF>$I^q^yne4~rQfUPRnpGhBNL6odlLYUuNwx- z7Wq5mr1Om##%DXqV*;wILwoXbj~PA9N_Ywxnh**`H>X#U*D2jLuDEt$24^EPdN9cg zLsEBPF*lQffBwL$uupp5&c$p(QwH>LFh^a}CYZYt?ayx+uZz$9FWTNZDy#nc76k)E zBt)b`LXeQ|7HJ6q=|;M{1q?u>1O%j|LAo2H8w8{TM7q2Cu1CMWbI-ZsoO92(V_g4v zAM|BEd+$%JHRoD$o;y&SCoN7*%J!J+kYvkHc~yrc9ii*1XpqM=gxn-vKQ*~oBFHPf z7^^NCuhzMrRFBDInOayI&!iec<~KMZ`)rpyRdnQ4+1>Vj!8uDe0^hZ{&Wm18MR~%QGB1)6_xIa-p&>h)N`&zf zOKh8ETH^H%I1+B;afx&kC(}zMIYmYXJ=P3Qr97h|JCj2fzwc(MSDtk>P|DdqsS0`~_MuycJ9p-uMkEMq(Us1E^e^J5nbl;eq`+kmLwl44sOw}qPlYAB@n<3H*>Oe z*2TV8W5Q-ubhG!f3(vm4>)mGDy@eeo8Macde4-J}-j|llY}Qgd_lNGR9VICC6({u> zyq0Rl7|ortSLd{1-SX&PDjCA)^9p;vGq)n6tMC*5X3ZfEi`4~r2#HWz4W{AFDp6cP zW%iQcsD=EVd#5NT2~+BJs`|_Ie)H*D^es=8x8-bsEHi;1cKvr<93(`DkQPEgB#4}a zGlz;m2TJhj+yUV?Kbo(d{q37bp2}WC()oL(Ot~EpS9^DU?g_QKlLp4BJ`l3i*41_P z_Cm+&K!L6hM2_HX40dvJ-*&>`0H&s=56sPF@Y+u$8-P}zt&I{ams{ywezWNk-fVbT zt>cD?7{>ea_(3{fHw_GSzr2t$GU1xke>o>)%T0aVC*()r!^cdm;KoJtaw(#o;<|(? zW%=awc`l)>@=rbQIGft!+J1_m>xj=L1~m%_-48^6n<~4EhN+)@%^a;m(2|Cg`Yy*; zw2v)6B~EYXL{u=v4%Mh%{WdP{!~YVcA~{1Qkz!}Gb9stAt1C-UAB|E=`QNX9AR$HUO!!UzP`40yuM-f(?w+PAK?JSTn#!r8|W&}J6^HHaDJDR#MJ#L z_&ey4J847Gy*CBY@9ab=0!>WE;_GuRtt&OUJF@SiDj*BUe7P1B6wiAv_0DbPdjn;} zYs$|sIgZ`=Ixk!W)?5~6@jpps9I!3!SKABG5Ui}}uNq+c6FglAT=AvK$mT4mXHnP> zG3i62W=BH4AG3#J`P+6u>;=!rom=WTs*3EEEOF&F6lQ9S1@g6?_h_we31p}Te&MU< z>gp7*JRhRyX^=GR{FQ+26f82+Nc@vU9&1_xbCb6z(KV!M=+(ARjI6U8{{4(E+eg=& zxb8=gg|;{|*Cea@63$&uC0Z5WXr!FI%^MTEP%GjEbVTC!_sjz3E+lniZg25j&~Am$ zn%4aslOuh|#z&STfsfjt)3=BDGcy>LmHJ5NG!3O8t`yT3!qpJp9*^4j-7OQ%wGhD) zH5XgW*8*xrtr`n~0~K$>N2`ba~I|KY$g==C{5ya z+gzOMl_NjebiCvT6!yAVsncOm>5&HSV7moX^JjI#X>Wt}?_NukHIREIVB>B_>mcI1 zcX{Z?<(kL4*22kqlm8-AfH z?K@JGbdTwZ!dcip1(`5yZP|)p**J*=+eN>l78&OrEZUiEoQ zl|D|K3*e+;v6MD=VhZ<(N#t!E`H>F8i4QF$Unzf!ZBaESRHj>g8+-6$dzYpX@3HPg zp~u-!m3m|f=kmb#^D5iy%c|c$*15|t68zCM)6p%REqUmfw`_1FpX@VM+~>dK!5-^M zw8|MfRlRxj1E0F*i?oc-Pi+^CP6B$h@DFRhEW@F2E0L~I3dyQ~ud66Gp+Bv3>T{O+ zJ(h!?OWcZ(ys_b?XwW5jkA{+@^jw!n{+*9&~{O+$o^z7GppmyrMPuySR6C)uVx~j z|Hid2BO|yLe8(|q>D#XJZn!en(rbML)~3m=0)0D{UZoMOk>FzK3G-RfN(dzky>#Jz z{;|+p`eY3|YKc&UalpM*erQ@ng%F9dJ%Pyx@VGcQR zGu_{L^^SHjUgTFkv0UUtVI>S<;dd;Lk#r+*b#0z}eVY31&wKy{T|A+0*7BG=EAJ|{9QytJlXi7QcPLcvN?xsUrGV0S@couTwuUc%cA z&CZUp)J=<~pFI9~h^g1t)Mkb2n1L@cg^ZJXtGsxrl;m5Uq4lqK9PAhoPi5z?hmDnR z7M1)!dHh*pP(AT;QzG``bN0y3`!c!1Uk^u8Rp0eJR}~UeTFv9@;&vu{7MeRhd}N<( z`-aU%pu``&ZIV0rIT23|ovo?o&cRKs2Wl!*C6{T}fARSH%>_o*)+gW2%(>Q`gjZbe zNiif|v3q6{+tTv&ZulkNI|>?ZdE>(EinyKE<`fE6)jL1^+;ak$C^K4=irw{<1Z+8PTk5jOPEUpfRm*bvQj(E2!>~pHhJtarY(FFx9}mYZ;%plOGBv-YVxRA zlLMx46B;U{=Z{X5*%oy(^ma&t-C|e#T>1_!WZo-p7)sgmo{YvMl$l*E-@qpI=_zF| z?jC+G%fiO7%)ZhP6L^v?mX>(iV0SNqse+qOrsYPYfpXjjGfu7_EB!-~7xQgWn-^W& zuV}XfRa(wXh0gCL2R-L1J}y9G$!7mcNW5eCl6rlB@RaQg?fzdzf^eH8t|{Xt%7{D~ zBEc`g#CY_`iu9gp!p!Ny53WS10o+B2P(yVO%|~ZF`ctQwcDeXsU&%i;GMU`lS>#kC zZSWQ2ep$reNpr8+PwGA4`8Hc`=JJkHn#{pXWue)mJNlzNUNRaMtw-4|2 zUtc4LS8M4QUX!$pAJlyy_TGWOPW;Km(t6XrzbqBH)j|_9Z-A^f;Tt0zVw7hO=Ps}9 zjbwK0l2$}8hG!S_P{<`Tk0?KvgvK0xL#h7Gp4SA9Fvk*0+7*kH@g`qcdVog=Xu*S)=*=VR(b?R)(#!_hq4 z$a}96igI<{kMl>*_b#Ev=~D|z2AkPmv+I(Jsx@!pw?QQ+YmVV~gv|kwp*f}@5=Mc>O#Nn(@F}jd{ zHb5xi=Kk)DTbvS;{9ETdUbzQPXRq=piw-#O|Em_@QU=@ZsYdB*nxb(RQlcyFB9iA+ z9OoOir(5@LKY2qL)%b3w^tA#XxpgptfvVZD7V*3SL^U?b(Cl1YQ}g-%8wn*lgs*Bw zuG(>8L7{oE6wWPo*~9JvDt##Egg*!LCv|tD?s5HWs@)o4QK-%+@2)#|tz4MKsAmyf z)mxqWv8M6I1BvmY*(sr0qOHH|-e9lcD&&kN+3NR?YfB<+P zxVpP@3aDhi1gISVnQb7erlv>`%+=&%Y!tSmgM-EC__10k)srxh$y+#@v?G%V>-^?a zn{PZ;`wRbaMwQ(i7rNw|*VAu}d^(q+)t~Eaaavh6{Y$E})FFgUHm|oy;CMzN(YEp|M z^5Lu#9+i*x26>BsG<-|T>#g7FjG%F29qOU)hDqKs_56Qzk^i1V`+ss@aNm*)B`$^l--Kr(MBpM|qCC#W;nxNj~l z`f21XN(i0ayEr{)p1N3cm;^DQ;^Ja_Hsia_H3^7D5NLt^?daCp+6sam%pebfgmAfr zMEceF`MGtq%zv1<%F$BV0LLmV2=EYTH6mp$0?tT_Q8nkxd1cV|%a<>lw|>;P*npy5 zT;hZ!Cuo8MspO=)Z2h)kTylq+3g#G@ikE<%0pi9X5E>NJGBI(c^6dUUV(EiN7kWfT zbu};iS`Sp%a)Wz%0+?cRbk z01)t^71mQ=OJuv%0ytArMC4*CHlGYWPqP94c_A7I*=47dMcGPi{E^a5`k zp=Sbx{`U6vh}U!d7RHS~=O=qW4yMt@ob7fq5eRx7b94)NU-HAnL4yPOUr!d}Y>t7Y zM0^48YdUrAEWpIUgLm}xEka)kw9*V#*yzF+opj234W{t>H#Z_Uw$r06dFZ2ss%OOO zcXe~)cvNC!WQ6Fof$%4XKczA=^wV zB`JvvTC$;U8+gT^t0#Sl0?*<1b`B11ew9xWgpoo96PRGAHU)F_m#V6Bz`Hv+9XQP~ z!FV|=^*Mq-9jza9;V6M9<7d%B=+QCrGy$$2sF&GZ&zG}jDTXDh=`R_|qIDHL&h8Tv zw7(D7d0+O(pD#&vwabw~#rF>lwmS2Os}h6-MekeUxuec0FdkVv2&@mHIBDf}O1 zc{ql|Za1F6PL+MC6%&2*;=R3JC8E>PQNvwl3NE{p%nY$CbK(O_-|knWlz*u++uBjr zA;|ZRYif!a;EFs}_9_am*fmf)E-@`#I^6Bk{YY?-ll{J%J#Lm->xfGMl*Gnfg>sa! zo}Qe*T>3OYC=7jTz)p!M;MAWi62VckJd}xPZEcN&kbMGSG!Qb24Y7lrJeGF2yE{kB z4VtOo|FVF3{^8*#)Xh+#AY4$;f5(!O$RC3w1@sfh$jD%dTH||z$dc0Ai7b{dtNE3c zaSCW)Ie9?x{h55v`b`-O)4Y7G&zfBF`XCdIb(k7j0#OAdLwnGp;k zVRPv75fu|F^1kw7z(o^+m22zZ&3ZJ+K|qX}sSr@%%FSK>X2b=qR)oQe zu}edy?A!@`8B0K00AYcJgVTcG*=1y8l)}fOd}TQZ(P6=>w%Qum({Bp!+Ia7yH(MNN zpU3b@_+M~kdzN~$JCKdMQ~YSu?O{2o>mxg$A4J^iEkhQ(V@emuIiJeCr+&ak6ybfq zpRwm5Ib9eLZ$KoSM|f2@BO~`kI8BG#V_3@>{W27j3AF zJdi&c7!7P$eOYRqQ)}>fkbYln7tJgNM`V(;cTM1~yPptlb6>h|eEFLOBc8ze&9~WI zB8R>&GA>ueD4w&z*ZIdgIR8A=gC;J$Rc6Z7U)KhwT`|wTKkQq=Rn$oTO2!?7DzMiv zmLQ)k+j#ZnMq(UxKt0vF`77Fo>`h`bW_%x0s7>d+KW*DGr%yyjB>o%04j22rqDeH?l$fLF5bG7w^ zF6s1Um`~16k<%`Y`FQ6P)DMO~^iRB4c)F{$?>w6;_@})`XS@q0VMQjDe;o?HH_(0yJcF|G4 zO$3*%AlszNc11>%M!5#KBj$j z`^ZjT%Hv(#8>YQo%7d*DCs%Zv^^MMMrr_#$&+3p*_0D8Vj3TEtqs(pm5o25WX)>_i zc64<7*=Z+hhw>#KsKp5j3wsL3`lct+Y@>qz#R*C{Aw2jT9nIxr zw*fUIh#s32M@3cDcCKm9W+=pt3xN;;>YZV;c}z!#D7&Jav6O{l4Se-ljZ2``MnYeo z9HzWh^-EnPc4}`}Z1H?9A<%@HF$Nn@{_1Z+kOKy-eTa?_L?M(bz_AC7a~ob)vy4k5 zQZLE4oo3nZ+__1X{wa#=`}}BB#O_(uT@y@NixLH>M>93RU)8xU>AB`M>v?A^wmK5+ zT`$AQt2?wdF#!zIog>~F6JDEzonP9)gPAi%tf1}wI>u8>8fFX6FI1mIKJcYh<2+Zv z;CzkM=GWP=apIemq$a$3enX~9?zegZDrFDD$(%i|EM}@$p2LCEkdARzZEu*Gj<^@fWo<2pO7Ym`_YyaS?J8eY{F@(v~ zu9g&m8SjzB4KjKR>`NW3>h?bJxE2O&f06WbZ#NiR{Nz+xjNX2NmB1YNRM6}0g?EGD zs_=t9DY<_bre?hx3#MIT+Rx<+H@0wp)t)*#5lCPxDvVe0O%d|O^4zHxyI3anI%&e8 zh^$M?k=Anrj%PG zFZQ+_8mLdAQSTNe{Ly-a_j2Ot;E-UuzWL*;Y~ha;`7>K4gyp)t5{Y@3Y&u>sG0oK# zdA=D+H^RtYXuS+V!<+W1_6xo_g?}_#Afw@jm0=z$4a8&G1zqTwe>4{FRIm0gP&GN@XHnl&;P7Z*of5@5+dzqGz-|L7>Qu<%n)kBoQ-@%YQc=x99X zaieBp3WdtEnS}*01o9u(@zEoaFd>>Sy$hqv*O0XI9;Xp&2BZ0R$;k-2b*ZivgTUlg z3INh&TzT%DUntN!TXN#@+Hf4wojnmtMf*5Ef}0O!6^oYZ>iX0rGchTTvueb!lbGKy zbBrN59pU?7vZvgVt}t<+GiC2=e!FI4EGDC;D8os6wiiPJCkb z=vy+&Q^@bakjVHriN4-q54-D4h0o#B*s}eU$c=_CDf^zjYD-odzP`w>hgOjf zr^KnGE8^q&XiFlb6vbi~D-XA9Nd*U(?vs4IR(prm zRmbq9K**~y9a9)|SZ1rl_5X-vsa zqTyI7-!V_XICw1QHqKZkZi$yKSj_HC6Q^S6(3Ss;49llp`YCE{V+k`)Agw!kaDR2#QMQiE5^p{0;F8^@(B}iuu=?l@kBIgSUynl<~vvQ>?)41Z5Vjh}=(MsqO z(~J*($@PlwR^@!fwS7=B7izPo{w%PR*PgB+5d|i~u0s%N{#9aDS;EeWW2=jJj@4?S zy84Rn!rZ8VJuz7wW`4Ldu_*!8gFc!h4Q{TyNvK1m5W_%4Q z{ZR_pf!SMmT}{a%9LY)|jj335p^23y;Zh$=D|fTYlr+A5-9qW=G;V)jQn>g|gu*+l zXHt+?xUtwBdF5xQsp|Ev^zLZs!*3pQ)+t!C{t_n4v(s(KQm1{qpOwc3n2<-?1G!dP=_4Tyf&Dc#m|A=c||S z=jX|0*0`Cet@urxc31a`Q1@6ka8nMRiCu_()OgKx{%b6|yImr1&5|JU$7e~EDAknJ zmqMt)bd#dTBP43}4+~i1S@c!qWapkO_1PxZs!uGpc4bhNl!W3s_2a|g@Jx20#?nY@ zdp+o5#D?b(IwL9hlI8;evMtoj>Di%9|K+RW2TG@$TCtpOAIcs&Aq}g0V zZ6{rXn>;J^38Y-ZElHn=3cT~eoJm({GWf~o&CN}#F8Y=!S?YravxMu)>0{8I(HCt` z#}yImEl1Pt&3zwb?Ylq_`MaNLg1@BYs;-rB?h0x3rBtvzuH7ARD|`EvFhK?V@tA!@ zF+5 z#}m@L^;>l`bt|lRv#bf*NwQs~uNipqbtdU@anWO+$dsbckVz9GzFA={W%n3EkS7;QFiZZmMZh=A z3@?mgp}s|t2Gdh5j-%wLjwI1p?#g#{Cd4mZV{}iK9GA~nEDlYJ_J=c+6F+WKK+6w* zmzK%!YA#u&npFGUoB=^(xinpO*JDAiPx6E1pG-a&^$0(yJZi+rrd}Fqh%j+@YW0Zb zvOd;m%d4%EUZ}zRCLUd>2FD+`k?HZcEz`=37X#yep1CFZ+Avky#+Pg#y))6Y8Bon` zRPL;Dz^Gr6(rCqO+0eAiypGVH#lZmt@&j4QbIxK_n((RZmw8-+HQxLVnL*TQ=wGQV zKgMJeU5cODEE*{NTz)Gf>0s5m<7o04u2jz-J-LJu1InP^ zp>js9JK~Bu6W9GD#f9{m8X^PUAaMHE)nSi1Id$CVkp<-`%N(yg_nKjffYS7O?QaHF|tkWboj(-_$6kBjHYehzBU!x97h)I-frZAlaPyKx|D> z`&Hk{?r8J9#A(=NL${j4juC0~5b~LjXcPM_qVhZ{vmCTYn}=aLY;JVLMXd^ANm-IV zZ`t1tT^(L+EpYx5K{ZxhXk>-WrzN;gJQ$a_>NkFLVGzSR)fi=EA^B_d2GjLA{~kSa zFhz)(;;#QC&9L@6CHWPzd6M=1U9#4aIkJ?RZ{+puCcE?Pnq#~ETv;z)npR7Ir~v=# z{JZ5#%|S%rZBarEjXEyq8dtV5*K0~D_K73+lb5z>2sCz4Eq?#Hb!toc@nZ{9W?4T2 zv63(@-(@9sd;b#K;;Mp;3JUvkMpAYC<6Aw zQ2qY%=TAg!9UzB4fBtCj_V$TOT$h?8Qz_8tE$J8ZXg|aQU_}b0(@sIM z4g_=9Kyx+(w<S>y$^|NrHoyYI%O&(RtL+ zO>_yOF2oPE+>mn`bcR2=i;j+Pj|VOMD)$4r9Mysh5cbL$ zme$oJ(<#8q9O~R%=msTk{^sUps7i%qc^1N8nCYS#*b~2gffCjCt)u%yM9&oz?ny~W z-MEGP8a>}*kmI2uukk17{sr$EYAmpRKE}nn4gAxQ%9cEhsBqd2mN!wN& zi_L~IBr67C1V?h!n@93Acg`+A2)fvLL!;b!3M>ggVD;4`&%4Hl(EOCET@z(BQ63f( zBL#3h64)(3)=ug+e~;60OxVTcDDA@E-~R*}>^gdT7s4b+lhe}PBXr{@CWvSehVCFU z)gJXk6Q7VUB`*)%=hrU{z{tnSt%&|5^cV%B9!f$rd~aF}8ugfEYNiZXX@&p#m^0Y3 zm5aLblY+njyA|3XAeHb9!H&9RY7AU2-+)Ft$Z#R!6A&~S6v32vJG7Dp*UuU5f*FM@ zDJ@O$I@1iuH6f>=m&SlB)FkkHU}_+b@?jI19ht;#*3U~v%5>h0|{G&Y7J zWFnrVR)d+<;T+H>jtCELTI`LZ@%;*d3g8t^c>oet6i}E57lt{53_yLz`weKJk-W_r z*Q-@!53^2AQ4xEh+^WX9qk4!SSRCLzodTD^V3deX_Ixpozw;kAli*p}=vqP%+AK6P z&0oZFSXgIW8%VZdFbpCfB{eoR{Qv-?_=s<_J}7P@e9-5vQ3autn6i~w!X-iJ3ZY^4 z?c1Hyfex6Uo!#A(LPAL|9*crG5_EM?(9#Ad=cvrsa#Nh0U0m9AGylq~$jPBEwk*@2 z+(JirMkNdzW-J(yAe5Dv@u}F@A|mNkz0x%2GVX-m`Sf>PxrAuOCLA~yYUB;ceSK9j z4q6g_KutF=ch9}6dsNZFaP4=0#-PvK@*}5lPM28wVw^X z9_DKcQ`R^CEzEVTcF>%!`Jw#jF&ZgF0S$~S@B#xM?FKDUAer{<8y!@SQfiCY43AZI zJFSg`eg6D@*t}JbS+7Wq8{P%Aiz?6(F z!${)dX&^}hW=(QA$hz$OF&n}>ASBfBNV}?JIW*$KhmP5_xVpgp6pS#HoJjZ@yUj@+ zU^4>8EvdPNN(K_b!OEeSARA4Z>?6Ci9RO1Ll>8 zg2F)Mg%u|exDg<5EwEA5D;a-GOH2Ofkx`pNbab>5@WCK%1N-Uvx+NKv$nT;&Go2>lM&}s}b;(XzqcsyU zBh4_2WO|o5-oxEVUCxrZ8r_VS6(NW#&Eq~6{V0>Xwz1^4sC!C#wV%p=KxS|2H_1-o z>KlD|%ERAqChNSYX)M@bFzYmj%Ha6u@2{l_lPelh$a552)&`vGy2ZA0hL-VGKb}6I zI`;Y=7P#>#39a54<6>W8oo6J-qeV)3K%DeqR!&+Q`J3)JibpR|z*bgr`snq}NdD@n z)*W5ql6s-hqj+dZ zdu`-=h`ENlzzu`Iv7Pkxu~?nvKyMG9!>6u04d)zuSKDibwU_9Z)fP1Umwn>5aMBbLa)QSX6pE_h8Rb#4u|;ndX!#bY|bnxZ(6h`SdBX$3SLntACh>^ z^*8i8Tp7{iui~9F#%YJmv5&eGUDC_%^&BNGcAv=Bo-!%BG63CZq1pN2$x`?91+V6P z@})QJ$Ge#yaULSZdESo}#s&-D@qS^I?RbG|RtV)VGM!LOM2aXHH{00pGKT%cw=8R- zC$n_pqE%>xhM(fB$5}$G(Sa^`%bindN`0 z#?^X~_Sq_(|K4{gF9nQ!=NV&G6FJ(2o3s^k?T-+ebuKJEAp$HcL1T<6tq@8$qId+%?5@){}1>YEScM z+&HS``fyI4jfNN!38@TSGkyGbGEd6g38T2bP>|Abh}|AqHD1Y6{XEBiHHp7BFj2y7 z5fyKTlWTJmDNP5>`ntB`EiIhZK7~3hMy)=3XU{EEI;&U8t0_}URL!@C9UL_fgBoVK z+DFG4mKRTw)RDeoGQE^uVQ#wVG`DFw|3kjM|2d7e<(c6l#^?9ey1%Y2d1S4j2gw!h zt?Cf6bgo3`ReShD-lN7J>5o}!(eF+YwUDAg*ckW^M6A%!P z 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

-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 brZHC!BWlC_*4k;2ze|Y73g-yEeE+`y5dT$u literal 0 HcmV?d00001 diff --git a/examples/proxmox.md b/examples/proxmox.md new file mode 100644 index 000000000..a8d588029 --- /dev/null +++ b/examples/proxmox.md @@ -0,0 +1,91 @@ +# Proxmox PVE/PBS + +## Helpful links + +- +- + +## Proxmox OIDC limitation + +As of December 2024 OIDC implementation in proxmox supports only authentication. +Authorization has to be done manually. +Mapping user to specific groups won't work yet (steps 2,3,4). + +Patch for this feature exists, but it hasn't been tested extensively: + +See also: + + +## On Kanidm + +### 1. Create the proxmox resource server + +```bash +kanidm system oauth2 create proxmox "proxmox" https://yourproxmox.example.com +``` + +### 2. Create the appropriate group(s) + +```bash +kanidm group create proxmox_users --name idm_admin +kanidm group create proxmox_admins --name idm_admin +``` + +### 3. Add the appropriate users to the group + +```bash +kanidm group add-members proxmox_users user.name +kanidm group add-members proxmox_admins user.name +``` + +### 4. scope map + +```bash +kanidm system oauth2 update-claim-map-join 'proxmox' 'proxmox_role' array +kanidm system oauth2 update-claim-map 'proxmox' 'proxmox_role' 'proxmox_admins' 'admin' +kanidm system oauth2 update-claim-map 'proxmox' 'proxmox_role' 'proxmox_users' 'user' +``` + +### 5. Add the scopes + +```bash +kanidm system oauth2 update-scope-map proxmox proxmox_users email profile openid +``` + +### 6. Get the client secret + +```bash +kanidm system oauth2 show-basic-secret proxmox +``` + +Copy the value that is returned. + +## On proxmox server + +### Using WebGUI + +Go to +Select Datacenter->Realms->Add->OpenID Connect Server +![](media/kanidm_proxmox.png) +Issuer URL: + +- +When kanidm is behind reverse proxy or when using docker port mapping: +- + +Realm: give some proper name or anything that's meaningful + +Client ID: name given in step 1 (resource server) + +Client Key: secret from step 6 + +Autocreate Users: Automatically create users if they do not exist. Users are stored in Proxmox Cluster File System (pmxcfs) - /etc/pve/user.cfg + +### Using CLI + +Login to proxmox node and execute: + +```bash +pveum realm add kanidm --type openid --issuer-url https://idm.example.com/oauth2/openid/proxmox --client-id proxmox --client-key="secret from step 6" --username-claim username --scopes="email profile openid" --autocreate +``` + From 3a3d3eb807b128103d53fc81213469f062ce5105 Mon Sep 17 00:00:00 2001 From: Krzysztof Dajka Date: Thu, 5 Dec 2024 09:54:21 +0100 Subject: [PATCH 02/87] Add redirect URL to proxmox documentation --- examples/proxmox.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/proxmox.md b/examples/proxmox.md index a8d588029..d6ed35a70 100644 --- a/examples/proxmox.md +++ b/examples/proxmox.md @@ -18,10 +18,11 @@ See also: ## On Kanidm -### 1. Create the proxmox resource server +### 1. Create the proxmox resource server and configure the redirect URL ```bash kanidm system oauth2 create proxmox "proxmox" https://yourproxmox.example.com +kanidm system oauth2 add-redirect-url "proxmox" https://yourproxmox.example.com ``` ### 2. Create the appropriate group(s) @@ -88,4 +89,3 @@ Login to proxmox node and execute: ```bash pveum realm add kanidm --type openid --issuer-url https://idm.example.com/oauth2/openid/proxmox --client-id proxmox --client-key="secret from step 6" --username-claim username --scopes="email profile openid" --autocreate ``` - From 2c53ae77c5913945f3ccf0a8be2527c465281525 Mon Sep 17 00:00:00 2001 From: Krzysztof Dajka Date: Thu, 5 Dec 2024 09:54:51 +0100 Subject: [PATCH 03/87] Update contributors list --- CONTRIBUTORS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 18d677b92..5d1e3712f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,6 +1,6 @@ ## Author -- William Brown (Firstyear): william@blackhats.net.au +- William Brown (Firstyear): ## Contributors @@ -44,6 +44,7 @@ - adamcstephens - Chris Olstrom (colstrom) - Christopher-Robin (cebbinghaus) +- Krzysztof Dajka (alteriks) ## Acknowledgements From 97a1c39d62ea58bd06db8d871538e38497e94c98 Mon Sep 17 00:00:00 2001 From: George Wu Date: Sun, 8 Dec 2024 18:52:51 -0800 Subject: [PATCH 04/87] pykanidm: Add retrieving credential reset token for a person. (#3279) --- pykanidm/kanidm/__init__.py | 29 +++++++++++++++++++++++++---- pykanidm/kanidm/models/person.py | 7 +++++++ pykanidm/kanidm/types.py | 11 ++++------- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/pykanidm/kanidm/__init__.py b/pykanidm/kanidm/__init__.py index cf0623069..ece21d27e 100644 --- a/pykanidm/kanidm/__init__.py +++ b/pykanidm/kanidm/__init__.py @@ -17,7 +17,13 @@ import yarl from kanidm.models.group import Group, GroupList, IGroup, RawGroup from kanidm.models.oauth2_rs import IOauth2Rs, OAuth2Rs, Oauth2RsList, RawOAuth2Rs -from kanidm.models.person import IPerson, Person, PersonList, RawPerson +from kanidm.models.person import ( + IPerson, + Person, + PersonList, + RawPerson, + PersonCredentialResetToken, +) from kanidm.models.service_account import ( IServiceAccount, ServiceAccount, @@ -93,7 +99,7 @@ class KanidmClient: """Constructor for KanidmClient""" self.logger = logger or getLogger(__name__) - self.instance_name = instance_name # TODO: use this in loaders etc + self.instance_name = instance_name # TODO: use this in loaders etc if config is not None: self.config = config else: @@ -123,7 +129,7 @@ class KanidmClient: def _configure_ssl(self) -> None: """Sets up SSL configuration for the client""" - if False in [self.config.verify_certificate, self.config.verify_hostnames ]: + if False in [self.config.verify_certificate, self.config.verify_hostnames]: logging.debug("Setting up SSL context with no verification") self._ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) self._ssl_context.hostname_checks_common_name = False @@ -135,7 +141,7 @@ class KanidmClient: raise FileNotFoundError(f"CA Path not found: {self.config.ca_path}") else: self.logger.debug("Setting up SSL context with CA path=%s", self.config.ca_path) - self._ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH,cafile=self.config.ca_path) + self._ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=self.config.ca_path) else: logging.debug("Setting up default SSL context") @@ -765,6 +771,21 @@ class KanidmClient: endpoint = f"{Endpoints.PERSON}/{id}" return await self.call_delete(endpoint) + async def person_account_credential_update_token(self, id: str, ttl: Optional[int] = None) -> PersonCredentialResetToken: + """Create a password reset token for person with an optional time to live in seconds""" + endpoint = f"{Endpoints.PERSON}/{id}/_credential/_update_intent" + if ttl: + endpoint = f"{endpoint}/{ttl}" + + response: ClientResponse[Any] = await self.call_get(endpoint) + if response.content is None: + raise ValueError(f"Failed to get token: {response.content}") + if response.status_code != 200: + raise ValueError(f"Failed to get token: {response.content}") + token = PersonCredentialResetToken.model_validate(json_lib.loads(response.content)) + + return token + async def person_account_post_ssh_key(self, id: str, tag: str, pubkey: str) -> ClientResponse[None]: """Create an SSH key for a user""" endpoint = f"{Endpoints.PERSON}/{id}/_ssh_pubkeys" diff --git a/pykanidm/kanidm/models/person.py b/pykanidm/kanidm/models/person.py index 0de64ace8..db1303d91 100644 --- a/pykanidm/kanidm/models/person.py +++ b/pykanidm/kanidm/models/person.py @@ -38,8 +38,15 @@ class RawPerson(BaseModel): uuid=UUID(self.attrs["uuid"][0]), ) + PersonList = RootModel[List[RawPerson]] class IPerson(TypedDict): attrs: Dict[str, List[str]] + + +class PersonCredentialResetToken(BaseModel): + token: str + expiry_time: int + model_config = ConfigDict(arbitrary_types_allowed=True) diff --git a/pykanidm/kanidm/types.py b/pykanidm/kanidm/types.py index 4988144de..383678967 100644 --- a/pykanidm/kanidm/types.py +++ b/pykanidm/kanidm/types.py @@ -1,4 +1,5 @@ """ type objects """ + # pylint: disable=too-few-public-methods # ^ disabling this because pydantic models don't have public methods @@ -31,7 +32,7 @@ class ClientResponse(BaseModel, Generic[T]): class AuthInitResponse(BaseModel): - """Aelps parse the response from the Auth 'init' stage""" + """Helps parse the response from the Auth 'init' stage""" class _AuthInitState(BaseModel): """sub-class for the AuthInitResponse model""" @@ -146,9 +147,7 @@ class RadiusClient(BaseModel): socket.gethostbyname(value) return value except socket.gaierror as error: - raise ValueError( - f"ipaddr value ({value}) wasn't an IP Address, Network or valid hostname: {error}" - ) + raise ValueError(f"ipaddr value ({value}) wasn't an IP Address, Network or valid hostname: {error}") class KanidmClientConfig(BaseModel): @@ -196,9 +195,7 @@ class KanidmClientConfig(BaseModel): uri = urlparse(value) valid_schemes = ["http", "https"] if uri.scheme not in valid_schemes: - raise ValueError( - f"Invalid URL Scheme for uri='{value}': '{uri.scheme}' - expected one of {valid_schemes}" - ) + raise ValueError(f"Invalid URL Scheme for uri='{value}': '{uri.scheme}' - expected one of {valid_schemes}") # make sure the URI ends with a / if not value.endswith("/"): From 5dfbf7ca79bc69e1fc54114364b2203663179d1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 03:44:41 +0000 Subject: [PATCH 05/87] Bump the all group with 5 updates (#3278) Bumps the all group with 5 updates: | Package | From | To | | --- | --- | --- | | [anyhow](https://github.com/dtolnay/anyhow) | `1.0.93` | `1.0.94` | | [clap](https://github.com/clap-rs/clap) | `4.5.21` | `4.5.23` | | [http](https://github.com/hyperium/http) | `1.1.0` | `1.2.0` | | [tokio](https://github.com/tokio-rs/tokio) | `1.41.1` | `1.42.0` | | [tokio-util](https://github.com/tokio-rs/tokio) | `0.7.12` | `0.7.13` | Updates `anyhow` from 1.0.93 to 1.0.94 - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.93...1.0.94) Updates `clap` from 4.5.21 to 4.5.23 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.21...clap_complete-v4.5.23) Updates `http` from 1.1.0 to 1.2.0 - [Release notes](https://github.com/hyperium/http/releases) - [Changelog](https://github.com/hyperium/http/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/http/compare/v1.1.0...v1.2.0) Updates `tokio` from 1.41.1 to 1.42.0 - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.41.1...tokio-1.42.0) Updates `tokio-util` from 0.7.12 to 0.7.13 - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-util-0.7.12...tokio-util-0.7.13) --- updated-dependencies: - dependency-name: anyhow dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: http dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: tokio dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: tokio-util dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 64 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 10 ++++----- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2093bae9..cb638a6cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arc-swap" @@ -156,7 +156,7 @@ checksum = "a41603f7cdbf5ac4af60760f17253eb6adf6ec5b6f14a7ed830cf687d375f163" dependencies = [ "askama", "axum-core 0.4.5", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -370,7 +370,7 @@ dependencies = [ "axum-macros", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "hyper 1.5.1", @@ -421,7 +421,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "mime", @@ -445,7 +445,7 @@ dependencies = [ "cookie 0.18.1", "fastrand", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "mime", @@ -466,7 +466,7 @@ dependencies = [ "async-trait", "axum-core 0.4.5", "futures-core", - "http 1.1.0", + "http 1.2.0", "pin-project-lite", "serde", "serde_json", @@ -492,7 +492,7 @@ checksum = "56bac90848f6a9393ac03c63c640925c4b7c8ca21654de40d53f55964667c7d8" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "hyper 1.5.1", @@ -799,9 +799,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -809,9 +809,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -842,9 +842,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clru" @@ -1533,7 +1533,7 @@ dependencies = [ "cookie 0.18.1", "futures-core", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body-util", "hyper 1.5.1", "hyper-tls", @@ -2328,7 +2328,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.1.0", + "http 1.2.0", "indexmap 2.6.0", "slab", "tokio", @@ -2425,9 +2425,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -2452,7 +2452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -2463,7 +2463,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -2529,7 +2529,7 @@ dependencies = [ "futures-channel", "futures-util", "h2 0.4.6", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -2561,7 +2561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", + "http 1.2.0", "hyper 1.5.1", "hyper-util", "rustls 0.23.19", @@ -2610,7 +2610,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "hyper 1.5.1", "pin-project-lite", @@ -3037,7 +3037,7 @@ name = "kanidm_client" version = "1.5.0-dev" dependencies = [ "compact_jwt 0.4.2", - "http 1.1.0", + "http 1.2.0", "hyper 1.5.1", "kanidm_lib_file_permissions", "kanidm_proto", @@ -3345,7 +3345,7 @@ dependencies = [ "escargot", "fantoccini", "futures", - "http 1.1.0", + "http 1.2.0", "jsonschema", "kanidm_build_profiles", "kanidm_client", @@ -3717,7 +3717,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.1.0", + "http 1.2.0", "httparse", "memchr", "mime", @@ -4806,7 +4806,7 @@ dependencies = [ "futures-core", "futures-util", "h2 0.4.6", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "hyper 1.5.1", @@ -5743,9 +5743,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -5836,9 +5836,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5949,7 +5949,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "http-range-header", diff --git a/Cargo.toml b/Cargo.toml index a71ef5681..e25ffe31e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -136,7 +136,7 @@ kanidm_utils_users = { path = "./libs/users", version = "=1.5.0-dev" } scim_proto = { path = "./libs/scim_proto", version = "=1.5.0-dev" } sketching = { path = "./libs/sketching", version = "=1.5.0-dev" } -anyhow = { version = "1.0.93" } +anyhow = { version = "1.0.94" } argon2 = { version = "0.5.3", features = ["alloc"] } askama = { version = "0.12.1", features = ["serde", "with-axum"] } askama_axum = { version = "0.4.0" } @@ -157,7 +157,7 @@ base64 = "^0.22.1" base64urlsafedata = "0.5.0" bitflags = "^2.6.0" bytes = "^1.9.0" -clap = { version = "^4.5.21", features = ["derive", "env"] } +clap = { version = "^4.5.23", features = ["derive", "env"] } clap_complete = "^4.5.38" # Forced by saffron/cron chrono = "^0.4.35" @@ -177,7 +177,7 @@ futures-util = { version = "^0.3.30", features = ["sink"] } gix = { version = "0.64.0", default-features = false } hashbrown = { version = "0.14.3", features = ["serde", "inline-more", "ahash"] } hex = "^0.4.3" -http = "1.1.0" +http = "1.2.0" hyper = { version = "1.5.1", features = [ "full", ] } # hyper full includes client/server/http2 @@ -263,9 +263,9 @@ tempfile = "3.14.0" testkit-macros = { path = "./server/testkit-macros" } time = { version = "^0.3.34", features = ["formatting", "local-offset"] } -tokio = "^1.41.1" +tokio = "^1.42.0" tokio-openssl = "^0.6.5" -tokio-util = "^0.7.12" +tokio-util = "^0.7.13" toml = "^0.5.11" tracing = { version = "^0.1.41", features = [ From cae780e0912d63dba05eccc907dbb6b35cc75bd1 Mon Sep 17 00:00:00 2001 From: George Wu Date: Sun, 8 Dec 2024 20:50:20 -0800 Subject: [PATCH 06/87] pykanidm: Make a little dry. (#3281) * pykanidm: Make a little dry --- pykanidm/kanidm/__init__.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/pykanidm/kanidm/__init__.py b/pykanidm/kanidm/__init__.py index ece21d27e..e70fb82e8 100644 --- a/pykanidm/kanidm/__init__.py +++ b/pykanidm/kanidm/__init__.py @@ -143,7 +143,6 @@ class KanidmClient: self.logger.debug("Setting up SSL context with CA path=%s", self.config.ca_path) self._ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=self.config.ca_path) else: - logging.debug("Setting up default SSL context") self._ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) @@ -527,9 +526,7 @@ class KanidmClient: """get an OAuth2 client""" endpoint = f"{Endpoints.OAUTH2}/{rs_name}" response: ClientResponse[IOauth2Rs] = await self.call_get(endpoint) - if response.status_code != 200: - raise ValueError(f"Failed to get oauth2 resource server: {response.content}") - if response.data is None: + if response.status_code != 200 or response.data is None: raise ValueError(f"Failed to get oauth2 resource server: {response.content}") return RawOAuth2Rs(**response.data).as_oauth2_rs @@ -589,9 +586,7 @@ class KanidmClient: """Get a service account""" endpoint = f"{Endpoints.SERVICE_ACCOUNT}/{name}" response: ClientResponse[IServiceAccount] = await self.call_get(endpoint) - if response.status_code != 200: - raise ValueError(f"Failed to get service account: {response.content}") - if response.data is None: + if response.status_code != 200 or response.data is None: raise ValueError(f"Failed to get service account: {response.content}") return RawServiceAccount(**response.data).as_service_account @@ -678,9 +673,7 @@ class KanidmClient: """Get a group""" endpoint = f"{Endpoints.GROUP}/{name}" response: ClientResponse[IGroup] = await self.call_get(endpoint) - if response.status_code != 200: - raise ValueError(f"Failed to get group: {response.content}") - if response.data is None: + if response.status_code != 200 or response.data is None: raise ValueError(f"Failed to get group: {response.content}") return RawGroup(**response.data).as_group @@ -725,9 +718,7 @@ class KanidmClient: """Get a person by name""" endpoint = f"{Endpoints.PERSON}/{name}" response: ClientResponse[IPerson] = await self.call_get(endpoint) - if response.status_code != 200: - raise ValueError(f"Failed to get person: {response.content}") - if response.data is None: + if response.status_code != 200 or response.data is None: raise ValueError(f"Failed to get person: {response.content}") return RawPerson(**response.data).as_person @@ -778,9 +769,7 @@ class KanidmClient: endpoint = f"{endpoint}/{ttl}" response: ClientResponse[Any] = await self.call_get(endpoint) - if response.content is None: - raise ValueError(f"Failed to get token: {response.content}") - if response.status_code != 200: + if response.status_code != 200 or response.content is None: raise ValueError(f"Failed to get token: {response.content}") token = PersonCredentialResetToken.model_validate(json_lib.loads(response.content)) From 07b9ca89390e43b4e4fc6c73995e874e6809b6fd Mon Sep 17 00:00:00 2001 From: Firstyear Date: Tue, 10 Dec 2024 13:49:57 +1000 Subject: [PATCH 07/87] Allow group managers to modify entry-managed-by (#3272) When we added entry-managed-by, we allowed it to be set on group creation but not post-group-creation. The idea was to delegate ownership of the group. However, this has the obvious trap that an account group like idm_admins can't alter entry-managed-by post creation, needing the use of the admin account which has access control privs, or a delete and recreate of the entry. Since the idm admin could delete and recreate the group with a new entry manager, there is functionally no difference to allowing them to modify the entry-managed-by here of low priv groups. This changes the group manager access control by default to allow this. --- server/lib/src/constants/acp.rs | 62 +++++++++++++++++++++++++++++ server/lib/src/server/migrations.rs | 5 ++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/server/lib/src/constants/acp.rs b/server/lib/src/constants/acp.rs index eae453e92..5868832e5 100644 --- a/server/lib/src/constants/acp.rs +++ b/server/lib/src/constants/acp.rs @@ -1797,6 +1797,68 @@ lazy_static! { }; } +lazy_static! { + pub static ref IDM_ACP_GROUP_MANAGE_DL9: BuiltinAcp = BuiltinAcp{ + classes: vec![ + EntryClass::Object, + EntryClass::AccessControlProfile, + EntryClass::AccessControlCreate, + EntryClass::AccessControlDelete, + EntryClass::AccessControlModify, + EntryClass::AccessControlSearch + ], + name: "idm_acp_group_manage", + uuid: UUID_IDM_ACP_GROUP_MANAGE_V1, + description: "Builtin IDM Control for creating and deleting groups in the directory", + receiver: BuiltinAcpReceiver::Group ( vec![UUID_IDM_GROUP_ADMINS] ), + // group which is not in HP, Recycled, Tombstone + target: BuiltinAcpTarget::Filter( ProtoFilter::And(vec![ + match_class_filter!(EntryClass::Group), + FILTER_ANDNOT_HP_OR_RECYCLED_OR_TOMBSTONE.clone(), + ])), + search_attrs: vec![ + Attribute::Class, + Attribute::Name, + Attribute::Uuid, + Attribute::Spn, + Attribute::Uuid, + Attribute::Description, + Attribute::Mail, + Attribute::Member, + Attribute::DynMember, + Attribute::EntryManagedBy, + ], + create_attrs: vec![ + Attribute::Class, + Attribute::Name, + Attribute::Uuid, + Attribute::Description, + Attribute::Mail, + Attribute::Member, + Attribute::EntryManagedBy, + ], + create_classes: vec![ + EntryClass::Object, + EntryClass::Group, + ], + modify_present_attrs: vec![ + Attribute::Name, + Attribute::Description, + Attribute::Mail, + Attribute::Member, + Attribute::EntryManagedBy, + ], + modify_removed_attrs: vec![ + Attribute::Name, + Attribute::Description, + Attribute::Mail, + Attribute::Member, + Attribute::EntryManagedBy, + ], + ..Default::default() + }; +} + lazy_static! { pub static ref IDM_ACP_GROUP_UNIX_MANAGE_V1: BuiltinAcp = BuiltinAcp { classes: vec![ diff --git a/server/lib/src/server/migrations.rs b/server/lib/src/server/migrations.rs index 2819ae997..e9fb0668b 100644 --- a/server/lib/src/server/migrations.rs +++ b/server/lib/src/server/migrations.rs @@ -660,7 +660,10 @@ impl QueryServerWriteTransaction<'_> { self.reload()?; - let idm_data = [IDM_ACP_OAUTH2_MANAGE_DL9.clone().into()]; + let idm_data = [ + IDM_ACP_OAUTH2_MANAGE_DL9.clone().into(), + IDM_ACP_GROUP_MANAGE_DL9.clone().into(), + ]; idm_data .into_iter() From b2906829e21d2f25d664308f9803ca66a383f5d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:49:46 +0000 Subject: [PATCH 08/87] Bump the all group across 1 directory with 6 updates (#3280) Bumps the all group with 6 updates in the /pykanidm directory: | Package | From | To | | --- | --- | --- | | [pydantic](https://github.com/pydantic/pydantic) | `2.10.2` | `2.10.3` | | [aiohttp](https://github.com/aio-libs/aiohttp) | `3.11.8` | `3.11.10` | | [pylint-pydantic](https://github.com/fcfangcc/pylint-pydantic) | `0.3.2` | `0.3.4` | | [coverage](https://github.com/nedbat/coveragepy) | `7.6.8` | `7.6.9` | | [mkdocs-material](https://github.com/squidfunk/mkdocs-material) | `9.5.47` | `9.5.48` | | [ruff](https://github.com/astral-sh/ruff) | `0.8.1` | `0.8.2` | Updates `pydantic` from 2.10.2 to 2.10.3 - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v2.10.2...v2.10.3) Updates `aiohttp` from 3.11.8 to 3.11.10 - [Release notes](https://github.com/aio-libs/aiohttp/releases) - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.11.8...v3.11.10) Updates `pylint-pydantic` from 0.3.2 to 0.3.4 - [Release notes](https://github.com/fcfangcc/pylint-pydantic/releases) - [Commits](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.2...v0.3.4) Updates `coverage` from 7.6.8 to 7.6.9 - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.6.8...7.6.9) Updates `mkdocs-material` from 9.5.47 to 9.5.48 - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.47...9.5.48) Updates `ruff` from 0.8.1 to 0.8.2 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.8.1...0.8.2) --- updated-dependencies: - dependency-name: pydantic dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: aiohttp dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: pylint-pydantic dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: coverage dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pykanidm/poetry.lock | 336 ++++++++++++++++++++-------------------- pykanidm/pyproject.toml | 8 +- 2 files changed, 172 insertions(+), 172 deletions(-) diff --git a/pykanidm/poetry.lock b/pykanidm/poetry.lock index ea28a8346..2cbcce635 100644 --- a/pykanidm/poetry.lock +++ b/pykanidm/poetry.lock @@ -13,87 +13,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.8" +version = "3.11.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2ca685c6a851ce64e511fbcb906e4dd97d13e567ca7ecb5cb30b184e15dc6d"}, - {file = "aiohttp-3.11.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52913bb8a0a72a57479f54b281300c9d23036aa9aa3ebbc9a32a643484eadfc2"}, - {file = "aiohttp-3.11.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:35dafc70051b6cbd6dafb533b4e3f0df6225a4896be373ef86367b2987409331"}, - {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:561b9596a9f90266673ef0b950c27e04ab597cdb53785e2ac91b83b33c31b509"}, - {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d479c1fdcc920056a06d04059db52eb8590ecbbb3acdcaeeea26a88ff782e94a"}, - {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ce8eb6444bb6e862feca664ce365afa8e2e32db24dcf1a502719a8a002f9274"}, - {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df9bf08eb93611b1d4d6245b6fecf88728e90eece00e00d554e1b0c445557d83"}, - {file = "aiohttp-3.11.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a20ddaa58fea717177fac9a4a1fb8b39be868aa4fed2af6de4313b7a08f0f71"}, - {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9f4aadfea6b48cfa17aef1a68ba6bee5a0246374f5a588e299a4f4ff5bd1c77b"}, - {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:aa7deebb4bc5143745e6282139d7b9de50beb6d06609df64d2c993ef496bc7eb"}, - {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fe503a76b9e3a13b62e64545693c9463afe9d429e0909120f7bb66de91ed8bc2"}, - {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1c5838a68e31712354129add1b5fe32b06aa05275f835130edc650e6288af05f"}, - {file = "aiohttp-3.11.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:832e58d9454fe501b0d092cdf660c0e34e16005f61acd06e1c79b0fc45019c94"}, - {file = "aiohttp-3.11.8-cp310-cp310-win32.whl", hash = "sha256:00618c37a350884c08e87cf9a6532be274d564227ac49e0b474cf41f27e1f190"}, - {file = "aiohttp-3.11.8-cp310-cp310-win_amd64.whl", hash = "sha256:8eeaac75203da1a54afe1faea3c855a1973026b54929112aa9b67bceadbcb0ca"}, - {file = "aiohttp-3.11.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8dd02b44555893adfe7cc4b3b454fee04f9dcec45cf66ef5bb53ebf393f0505"}, - {file = "aiohttp-3.11.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658052941324edea3dee1f681375e70779f55e437e07bdfc4b5bbe65ad53cefb"}, - {file = "aiohttp-3.11.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c829471a9e2266da4a0666f8a9e215f19320f79778af379c1c7db324ac24ed2"}, - {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d21951756690f5d86d0215da38eb0fd65def03b5e2a1c08a4a39718a6d0d48f2"}, - {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2fa50ddc6b21cc1ae23e13524d6f75b27e279fdf5cf905b2df6fd171891ac4e2"}, - {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5afbd805e449048ecebb1a256176e953d4ca9e48bab387d4d1c8524f1c7a95"}, - {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea68db69f2a4ddc24b28b8e754fc0b963ed7f9b9a76137f06fe44643d6821fbd"}, - {file = "aiohttp-3.11.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b3ac163145660ce660aed2f1005e6d4de840d39728990b7250525eeec4e4a8"}, - {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e9ac0cce897904b77e109e5403ed713187dbdf96832bfd061ac07164264be16c"}, - {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3260c77cff4e35245bc517658bd54d7a64787f71f3c4f723877c82f22835b032"}, - {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7fd9c11ffad6b022bf02a41a70418cb2ab3b33f2c27842a5999e3ab78daf280"}, - {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16bda233a7b159ab08107e8858fedca90a9de287057fab54cafde51bd83f9819"}, - {file = "aiohttp-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4867008617bbf86e9fb5b00f72dd0e3a00a579b32233caff834320867f9b7cac"}, - {file = "aiohttp-3.11.8-cp311-cp311-win32.whl", hash = "sha256:17e6b9d8e29e3bfc7f893f327e92c9769d3582cee2fb1652c1431ac3f60115a0"}, - {file = "aiohttp-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:7f3be4961a5c2c670f31caab7641a37ea2a97031f0d8ae15bcfd36b6bf273200"}, - {file = "aiohttp-3.11.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e3b5bfef913d6be270c81976fbc0cbf66625cd92663bbb7e03b3adbd6aa4ac6"}, - {file = "aiohttp-3.11.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb51a81cb637b9a072c9cfae1839e35c6579638861eb3479eb5d6e6ce8bc6782"}, - {file = "aiohttp-3.11.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd2ca84e5f7a35f313a62eb7d6a50bac6760b60bafce34586750712731c0aeff"}, - {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47c6663df9446aa848b478413219600da4b54bc0409e1ac4bc80fb1a81501363"}, - {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c665ed4b52256614858b20711bbbd2755b0e19ec86870f8ff1645acf9ae9e760"}, - {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35d4545e7684da7a954ffc2dce495462cb16a902dffdebe98572408f6aaaee83"}, - {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85be3899e6860dd2cd3f4370ded6708e939d00d5ec922a8eb328d114db605a47"}, - {file = "aiohttp-3.11.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ed9f1f2697713c48efc9ec483ad5d062e4aa91854f090a3eba0b19c002851d"}, - {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c0dbae99737badf3f5e862088a118e28d3b36f03eb608a6382eddfd68178e05b"}, - {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:beae08f900b2980af4353a0200eb162b39f276fd8a6e43079a540f83964671f4"}, - {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d6f9e5fd1b3ecbaca3e04a15a02d1fa213248608caee99fd5bdddd4759959cf7"}, - {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7def89a41fe32120d89cd4577f5efbab3c52234c5890066ced8a2f7202dff88"}, - {file = "aiohttp-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98f596cf59292e779bc387f22378a3d2c5e052c9fe2bf822ac4f547c6fe57758"}, - {file = "aiohttp-3.11.8-cp312-cp312-win32.whl", hash = "sha256:b64fa6b76b35b695cd3e5c42a4e568cbea8d41c9e59165e2a43da00976e2027e"}, - {file = "aiohttp-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:afba47981ff73b1794c00dce774334dcfe62664b3b4f78f278b77d21ce9daf43"}, - {file = "aiohttp-3.11.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a81525430da5ca356fae6e889daeb6f5cc0d5f0cef88e59cdde48e2394ea1365"}, - {file = "aiohttp-3.11.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7565689e86a88c1d258351ebd14e343337b76a56ca5c0a2c1db96ec28149386f"}, - {file = "aiohttp-3.11.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0f9dbe9763c014c408ad51a027dc9582518e992dc63e2ffe359ac1b4840a560"}, - {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca580edc3ccd7f6ea76ad9cf59f5a8756d338e770b5eda7be26bcda8fa7ef53"}, - {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d141631a7348038fc7b5d1a81b3c9afa9aa056188ded7902fe754028fdea5c5"}, - {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64e6b14608a56a4c76c60daac730b0c0eeaf9d10dfc3231f7fc26521a0d628fd"}, - {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0983d0ce329f2f9dbeb355c3744bd6333f34e0dc56025b6b7d4f285b90acb51e"}, - {file = "aiohttp-3.11.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d96b93a46a3742880fa21bcb35c6c40cf27714ec0fb8ec85fe444d73b95131b9"}, - {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f4f1779c3142d913c509c2ed1de8b8f920e07a5cd65ac1f57c61cfb6bfded5a4"}, - {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:48be7cff468c9c0d86a02e6a826e1fe159094b16d5aa2c17703e7317f791b0f9"}, - {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:daea456b79ca2bacc7f062845bbb1139c3b3231fc83169da5a682cf385416dd1"}, - {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c92e763cf641e10ad9342597d20060ba23de5e411aada96660e679e3f9371189"}, - {file = "aiohttp-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a750ee5a177e0f873d6b2d7d0fa6e1e7c658fc0ca8ea56438dcba2ac94bedb09"}, - {file = "aiohttp-3.11.8-cp313-cp313-win32.whl", hash = "sha256:4448c9c7f77bad48a6569062c0c16deb77fbb7363de1dc71ed087f66fb3b3c96"}, - {file = "aiohttp-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:481075a1949de79a8a6841e0086f2f5f464785c592cf527ed0db2c0cbd0e1ba2"}, - {file = "aiohttp-3.11.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72779bfb34d6d6b51e55a7f4901b410e416b5431738b367d49696928c91a2ca8"}, - {file = "aiohttp-3.11.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e6523f39071a01757048985e4cc22d04aa130bc40d9128503f3a61a3ee98328"}, - {file = "aiohttp-3.11.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:220bbce18b3046973465be45415430f1cab39d7fdc40cbcf0a8c05485c6902fe"}, - {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336bbf7a33dd8cb4a7afb98c70e9935a81e5e88f7ac595ba2e84b1fb5da190d6"}, - {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c5e4f1ba5059b85e05c551961a448ce2689c6249ed6a2e2174796842c191d10"}, - {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9f9fd5c672c962389429abd11ed32c9c93f7932fd58584cae1e43951b141c6b"}, - {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58bd94ad48143e1d42e05fc055da41de0a9933f378ad87760595b8aec83d317b"}, - {file = "aiohttp-3.11.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bf52642b12d70d78c18882915201bc5345f7c8f0f2ab8919d99b886aa6475a7"}, - {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fee12d8487b0df2b683424cca2a0d8fb7281d5607518d742e98119a74af01026"}, - {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:65fd04f1fea668ad1af48ac31b752000e222dccffedcad3de8ccf9d34489ccd3"}, - {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c3f397e0511a0ec4fe331e602fc057dfd336d352062deb9969ebd81e253a149c"}, - {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:cf8f05f4abe3288fe2e106e1461fd20d8abf6103886ddfb6d746a5b8fb830d2b"}, - {file = "aiohttp-3.11.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7d71d4ac0792ff89541179394d303be846a0b6cd3821ae67286ee69ecec16f9f"}, - {file = "aiohttp-3.11.8-cp39-cp39-win32.whl", hash = "sha256:2b6f8716044ae5e5f2a3b4e4b6bfee48e97c8b2a92e56f43aadd728c7fd26b7d"}, - {file = "aiohttp-3.11.8-cp39-cp39-win_amd64.whl", hash = "sha256:da343903214bf9f9d314b913caa499fa19e26d73e6e23a3db7d4898ea6d47028"}, - {file = "aiohttp-3.11.8.tar.gz", hash = "sha256:7bc9d64a2350cbb29a9732334e1a0743cbb6844de1731cbdf5949b235653f3fd"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, + {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, + {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, + {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, + {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, + {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, + {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, + {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, + {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, + {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, + {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, + {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, + {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, + {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, + {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, + {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, + {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, + {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, + {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, + {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, + {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, + {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, + {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, + {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, + {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, + {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, + {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, ] [package.dependencies] @@ -468,73 +468,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.8" +version = "7.6.9" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50"}, - {file = "coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed"}, - {file = "coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e"}, - {file = "coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a"}, - {file = "coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4"}, - {file = "coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0"}, - {file = "coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801"}, - {file = "coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"}, - {file = "coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee"}, - {file = "coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443"}, - {file = "coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad"}, - {file = "coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4"}, - {file = "coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb"}, - {file = "coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b"}, - {file = "coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146"}, - {file = "coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28"}, - {file = "coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d"}, - {file = "coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b"}, - {file = "coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71"}, - {file = "coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc"}, - {file = "coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e"}, - {file = "coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea"}, - {file = "coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e"}, - {file = "coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076"}, - {file = "coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce"}, - {file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.extras] @@ -1032,13 +1032,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.47" +version = "9.5.48" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.47-py3-none-any.whl", hash = "sha256:53fb9c9624e7865da6ec807d116cd7be24b3cb36ab31b1d1d1a9af58c56009a2"}, - {file = "mkdocs_material-9.5.47.tar.gz", hash = "sha256:fc3b7a8e00ad896660bd3a5cc12ca0cb28bdc2bcbe2a946b5714c23ac91b0ede"}, + {file = "mkdocs_material-9.5.48-py3-none-any.whl", hash = "sha256:b695c998f4b939ce748adbc0d3bff73fa886a670ece948cf27818fa115dc16f8"}, + {file = "mkdocs_material-9.5.48.tar.gz", hash = "sha256:a582531e8b34f4c7ed38c29d5c44763053832cf2a32f7409567e0c74749a47db"}, ] [package.dependencies] @@ -1495,13 +1495,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.2" +version = "2.10.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e"}, - {file = "pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa"}, + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, ] [package.dependencies] @@ -1685,12 +1685,12 @@ pylint = ">=1.7" [[package]] name = "pylint-pydantic" -version = "0.3.2" +version = "0.3.4" description = "A Pylint plugin to help Pylint understand the Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pylint_pydantic-0.3.2-py3-none-any.whl", hash = "sha256:e5cec02370aa68ac8eff138e5d573b0ac049bab864e9a6c3a9057cf043440aa1"}, + {file = "pylint_pydantic-0.3.4-py3-none-any.whl", hash = "sha256:f82fdf6b05045102fef2bd8b553a118aadf80155116f374a76eb201c47160a68"}, ] [package.dependencies] @@ -2135,29 +2135,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.1" +version = "0.8.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, - {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, - {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, - {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, - {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, - {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, - {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, - {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, - {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, + {file = "ruff-0.8.2-py3-none-linux_armv6l.whl", hash = "sha256:c49ab4da37e7c457105aadfd2725e24305ff9bc908487a9bf8d548c6dad8bb3d"}, + {file = "ruff-0.8.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec016beb69ac16be416c435828be702ee694c0d722505f9c1f35e1b9c0cc1bf5"}, + {file = "ruff-0.8.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f05cdf8d050b30e2ba55c9b09330b51f9f97d36d4673213679b965d25a785f3c"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60f578c11feb1d3d257b2fb043ddb47501ab4816e7e221fbb0077f0d5d4e7b6f"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbd5cf9b0ae8f30eebc7b360171bd50f59ab29d39f06a670b3e4501a36ba5897"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b402ddee3d777683de60ff76da801fa7e5e8a71038f57ee53e903afbcefdaa58"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:705832cd7d85605cb7858d8a13d75993c8f3ef1397b0831289109e953d833d29"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32096b41aaf7a5cc095fa45b4167b890e4c8d3fd217603f3634c92a541de7248"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e769083da9439508833cfc7c23e351e1809e67f47c50248250ce1ac52c21fb93"}, + {file = "ruff-0.8.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe716592ae8a376c2673fdfc1f5c0c193a6d0411f90a496863c99cd9e2ae25d"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:81c148825277e737493242b44c5388a300584d73d5774defa9245aaef55448b0"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d261d7850c8367704874847d95febc698a950bf061c9475d4a8b7689adc4f7fa"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1ca4e3a87496dc07d2427b7dd7ffa88a1e597c28dad65ae6433ecb9f2e4f022f"}, + {file = "ruff-0.8.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:729850feed82ef2440aa27946ab39c18cb4a8889c1128a6d589ffa028ddcfc22"}, + {file = "ruff-0.8.2-py3-none-win32.whl", hash = "sha256:ac42caaa0411d6a7d9594363294416e0e48fc1279e1b0e948391695db2b3d5b1"}, + {file = "ruff-0.8.2-py3-none-win_amd64.whl", hash = "sha256:2aae99ec70abf43372612a838d97bfe77d45146254568d94926e8ed5bbb409ea"}, + {file = "ruff-0.8.2-py3-none-win_arm64.whl", hash = "sha256:fb88e2a506b70cfbc2de6fae6681c4f944f7dd5f2fe87233a7233d888bad73e8"}, + {file = "ruff-0.8.2.tar.gz", hash = "sha256:b84f4f414dda8ac7f75075c1fa0b905ac0ff25361f42e6d5da681a465e0f78e5"}, ] [[package]] @@ -2414,4 +2414,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d5fc77baf896f8ff41baa174c20f9070bb9dba6b38ba47c64f667d47272eae76" +content-hash = "19465d40ffacb007e20b369a30a8209a62413742686ad11679e5d32a658017ca" diff --git a/pykanidm/pyproject.toml b/pykanidm/pyproject.toml index a1fafefc4..269058ece 100644 --- a/pykanidm/pyproject.toml +++ b/pykanidm/pyproject.toml @@ -31,21 +31,21 @@ Authlib = "^1.2.0" mypy = "^1.13" pytest = "^8.3.4" types-toml = "^0.10.8" -pylint-pydantic = "^0.3.2" -coverage = "^7.6.8" +pylint-pydantic = "^0.3.4" +coverage = "^7.6.9" pylint-pytest = "^1.1.7" pytest-asyncio = "^0.24.0" pytest-mock = "^3.14.0" pytest-aiohttp = "^1.0.5" black = "^24.10.0" mkdocs = "^1.5.3" -mkdocs-material = "^9.5.47" +mkdocs-material = "^9.5.48" mkdocstrings = "^0.27.0" mkdocstrings-python = "^1.12.2" pook = "^2.1.2" [tool.poetry.group.dev.dependencies] -ruff = ">=0.5.1,<0.8.2" +ruff = ">=0.5.1,<0.8.3" [build-system] requires = ["poetry-core>=1.0.0"] From 4ee9a3a098642dfa8a979f51322ae2646be5f1d3 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Thu, 12 Dec 2024 07:53:22 +1000 Subject: [PATCH 09/87] Minor tweaks to cred reset ui (#3284) --- server/core/templates/credentials_reset.html | 5 ++-- .../templates/credentials_reset_form.html | 5 ++-- .../templates/credentials_update_partial.html | 26 +++++-------------- .../templates/credentials_update_primary.html | 6 ++--- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/server/core/templates/credentials_reset.html b/server/core/templates/credentials_reset.html index 5028b9706..bf593093b 100644 --- a/server/core/templates/credentials_reset.html +++ b/server/core/templates/credentials_reset.html @@ -5,13 +5,14 @@ (% endblock %) (% block body %) -

+

Updating Credentials

User: (( names ))

Kanidm domain: (( domain_info.display_name() ))

-
+
(( credentials_update_partial|safe )) +
(% endblock %) diff --git a/server/core/templates/credentials_reset_form.html b/server/core/templates/credentials_reset_form.html index 38a64849e..ec37c7be7 100644 --- a/server/core/templates/credentials_reset_form.html +++ b/server/core/templates/credentials_reset_form.html @@ -22,8 +22,9 @@ src="/pkg/img/logo-square.svg?v=((crate::https::cache_buster::get_cache_buster_key()))" alt="(( domain_info.display_name() ))" class="kanidm_logo" /> (% endif %) -

Credential Reset

-

(( domain_info.display_name() ))

+

(( domain_info.display_name() ))

+
+

Credential Reset

diff --git a/server/core/templates/credentials_update_partial.html b/server/core/templates/credentials_update_partial.html index e96ac73f5..c6b80128c 100644 --- a/server/core/templates/credentials_update_partial.html +++ b/server/core/templates/credentials_update_partial.html @@ -81,24 +81,12 @@ (% when CUCredState::Modifiable %) (% include "credentials_update_passkeys.html" %) -
- - - -
+ (% when CUCredState::DeleteOnly %) (% if passkeys.len() > 0 %) @@ -117,7 +105,7 @@

UNIX Password

This password is used when authenticating to a UNIX-like system

-
-
@@ -36,7 +36,7 @@

TOTPs are 6 digit codes generated on-demand as a second authentication factor.

-
@@ -121,4 +121,4 @@ (% endif %) - \ No newline at end of file + From 60cc830ebd80571bb551217b75f753422899b376 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Thu, 12 Dec 2024 21:56:12 +1000 Subject: [PATCH 10/87] Cleanup webauthn features (#3285) --- Cargo.toml | 1 - tools/cli/Cargo.toml | 20 ++++++++++++++++++-- tools/cli/src/cli/webauthn/mod.rs | 14 ++++++++++++-- tools/cli/src/cli/webauthn/mozilla.rs | 6 +++--- tools/cli/src/cli/webauthn/u2fhid.rs | 5 +++++ 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 tools/cli/src/cli/webauthn/u2fhid.rs diff --git a/Cargo.toml b/Cargo.toml index e25ffe31e..9df46e583 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -284,7 +284,6 @@ uuid = "^1.11.0" webauthn-authenticator-rs = { version = "0.5.0", features = [ "softpasskey", "softtoken", - "mozilla", ] } webauthn-rs = { version = "0.5.0", features = ["preview-features"] } webauthn-rs-core = "0.5.0" diff --git a/tools/cli/Cargo.toml b/tools/cli/Cargo.toml index 959cdc4e7..b5ac95e20 100644 --- a/tools/cli/Cargo.toml +++ b/tools/cli/Cargo.toml @@ -78,9 +78,25 @@ url = { workspace = true } workspace = true features = ["win10"] -[target."cfg(not(any(target_os = \"windows\")))".dependencies.webauthn-authenticator-rs] +[target."cfg(target_os = \"linux\")".dependencies.webauthn-authenticator-rs] workspace = true -features = ["u2fhid"] +features = [ + "u2fhid", + "mozilla", +] + +[target."cfg(target_os = \"macos\")".dependencies.webauthn-authenticator-rs] +workspace = true +features = [ + "u2fhid", + "mozilla", +] + +[target."cfg(target_os = \"freebsd\")".dependencies.webauthn-authenticator-rs] +workspace = true +features = [ + "mozilla", +] ## Debian packaging [package.metadata.deb] diff --git a/tools/cli/src/cli/webauthn/mod.rs b/tools/cli/src/cli/webauthn/mod.rs index f3ae84e59..0af5641f1 100644 --- a/tools/cli/src/cli/webauthn/mod.rs +++ b/tools/cli/src/cli/webauthn/mod.rs @@ -1,6 +1,16 @@ -#[cfg(not(any(target_os = "windows")))] +#[cfg(target_os = "linux")] +mod u2fhid; +#[cfg(target_os = "linux")] +use u2fhid::get_authenticator_backend; + +#[cfg(target_os = "macos")] mod mozilla; -#[cfg(not(any(target_os = "windows")))] +#[cfg(target_os = "macos")] +use mozilla::get_authenticator_backend; + +#[cfg(target_os = "freebsd")] +mod mozilla; +#[cfg(target_os = "freebsd")] use mozilla::get_authenticator_backend; #[cfg(target_os = "windows")] diff --git a/tools/cli/src/cli/webauthn/mozilla.rs b/tools/cli/src/cli/webauthn/mozilla.rs index dfe0d3ca8..4e392d52c 100644 --- a/tools/cli/src/cli/webauthn/mozilla.rs +++ b/tools/cli/src/cli/webauthn/mozilla.rs @@ -1,5 +1,5 @@ -use webauthn_authenticator_rs::u2fhid::U2FHid; +use webauthn_authenticator_rs::mozilla::MozillaAuthenticator; -pub fn get_authenticator_backend() -> U2FHid { - U2FHid::new() +pub fn get_authenticator_backend() -> MozillaAuthenticator { + MozillaAuthenticator::default() } diff --git a/tools/cli/src/cli/webauthn/u2fhid.rs b/tools/cli/src/cli/webauthn/u2fhid.rs new file mode 100644 index 000000000..dfe0d3ca8 --- /dev/null +++ b/tools/cli/src/cli/webauthn/u2fhid.rs @@ -0,0 +1,5 @@ +use webauthn_authenticator_rs::u2fhid::U2FHid; + +pub fn get_authenticator_backend() -> U2FHid { + U2FHid::new() +} From 5dfba2a0ef1f8d2348c32afc8012d57896325f7f Mon Sep 17 00:00:00 2001 From: Firstyear Date: Fri, 13 Dec 2024 10:23:54 +1000 Subject: [PATCH 11/87] Add CORS headers to jwks and userinfo (#3283) When using jwks from a single page application, the keys and userinfo were unable to be retrieved due to missing cors headers. --- server/core/src/https/oauth2.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/server/core/src/https/oauth2.rs b/server/core/src/https/oauth2.rs index cfb783b6e..aedeb3ba7 100644 --- a/server/core/src/https/oauth2.rs +++ b/server/core/src/https/oauth2.rs @@ -20,7 +20,6 @@ use axum::{ Extension, Form, Json, Router, }; use axum_macros::debug_handler; -use compact_jwt::{JwkKeySet, OidcToken}; use kanidm_proto::constants::uri::{ OAUTH2_AUTHORISE, OAUTH2_AUTHORISE_PERMIT, OAUTH2_AUTHORISE_REJECT, }; @@ -587,13 +586,13 @@ pub async fn oauth2_openid_userinfo_get( Path(client_id): Path, Extension(kopid): Extension, VerifiedClientInformation(client_auth_info): VerifiedClientInformation, -) -> Result, HTTPOauth2Error> { +) -> Response { // The token we want to inspect is in the authorisation header. let client_token = match client_auth_info.bearer_token { Some(val) => val, None => { error!("Bearer Authentication Not Provided"); - return Err(HTTPOauth2Error(Oauth2Error::AuthenticationRequired)); + return HTTPOauth2Error(Oauth2Error::AuthenticationRequired).into_response(); } }; @@ -603,8 +602,13 @@ pub async fn oauth2_openid_userinfo_get( .await; match res { - Ok(uir) => Ok(Json(uir)), - Err(e) => Err(HTTPOauth2Error(e)), + Ok(uir) => ( + StatusCode::OK, + [(ACCESS_CONTROL_ALLOW_ORIGIN, "*")], + Json(uir), + ) + .into_response(), + Err(e) => HTTPOauth2Error(e).into_response(), } } @@ -612,13 +616,18 @@ pub async fn oauth2_openid_publickey_get( State(state): State, Path(client_id): Path, Extension(kopid): Extension, -) -> Result, WebError> { - state +) -> Response { + let res = state .qe_r_ref .handle_oauth2_openid_publickey(client_id, kopid.eventid) .await .map(Json::from) - .map_err(WebError::from) + .map_err(WebError::from); + + match res { + Ok(jsn) => (StatusCode::OK, [(ACCESS_CONTROL_ALLOW_ORIGIN, "*")], jsn).into_response(), + Err(web_err) => web_err.response_with_access_control_origin_header(), + } } /// This is called directly by the resource server, where we then issue @@ -789,7 +798,7 @@ pub fn route_setup(state: ServerState) -> Router { // // IF YOU CHANGE THESE VALUES YOU MUST UPDATE OIDC DISCOVERY URLS .route( "/oauth2/openid/:client_id/public_key.jwk", - get(oauth2_openid_publickey_get), + get(oauth2_openid_publickey_get).options(oauth2_preflight_options), ) // // ⚠️ ⚠️ WARNING ⚠️ ⚠️ // // IF YOU CHANGE THESE VALUES YOU MUST UPDATE OAUTH2 DISCOVERY URLS From a8d149db16c2dfe24a92cdccb1b44a2c60d7bfa4 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Fri, 13 Dec 2024 13:19:10 +1000 Subject: [PATCH 12/87] remove unused webauthn features. (#3286) While improving the webauthn feature handling yesterday I accidentally left mozilla enabled on linux which doesn't need it and u2fhid on macos. In the future the plan is to swap fully to u2fhid, but in the mean time we need mozilla for freebsd support. That's something I'll need to work on later with @micolous. --- tools/cli/Cargo.toml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/tools/cli/Cargo.toml b/tools/cli/Cargo.toml index b5ac95e20..58a0b5128 100644 --- a/tools/cli/Cargo.toml +++ b/tools/cli/Cargo.toml @@ -74,29 +74,23 @@ serde_json = { workspace = true } uuid = { workspace = true } url = { workspace = true } +## See src/cli/webauthn/mod.rs for which features are +## required for which target_os here [target."cfg(target_os = \"windows\")".dependencies.webauthn-authenticator-rs] workspace = true features = ["win10"] [target."cfg(target_os = \"linux\")".dependencies.webauthn-authenticator-rs] workspace = true -features = [ - "u2fhid", - "mozilla", -] +features = ["u2fhid"] [target."cfg(target_os = \"macos\")".dependencies.webauthn-authenticator-rs] workspace = true -features = [ - "u2fhid", - "mozilla", -] +features = ["mozilla"] [target."cfg(target_os = \"freebsd\")".dependencies.webauthn-authenticator-rs] workspace = true -features = [ - "mozilla", -] +features = ["mozilla"] ## Debian packaging [package.metadata.deb] From d62c17cd0e9b14e58e17e64fbd7b17a520f1bcab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 20:27:40 +0000 Subject: [PATCH 13/87] Bump the all group in /pykanidm with 2 updates (#3293) Bumps the all group in /pykanidm with 2 updates: [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) and [ruff](https://github.com/astral-sh/ruff). Updates `pytest-asyncio` from 0.24.0 to 0.25.0 - [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases) - [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.24.0...v0.25.0) Updates `ruff` from 0.8.2 to 0.8.3 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.8.2...0.8.3) --- updated-dependencies: - dependency-name: pytest-asyncio dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pykanidm/poetry.lock | 52 ++++++++++++++++++++--------------------- pykanidm/pyproject.toml | 4 ++-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pykanidm/poetry.lock b/pykanidm/poetry.lock index 2cbcce635..6f8caf724 100644 --- a/pykanidm/poetry.lock +++ b/pykanidm/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -1774,20 +1774,20 @@ testing = ["coverage (==6.2)", "mypy (==0.931)"] [[package]] name = "pytest-asyncio" -version = "0.24.0" +version = "0.25.0" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, - {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, + {file = "pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3"}, + {file = "pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609"}, ] [package.dependencies] pytest = ">=8.2,<9" [package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] @@ -2135,29 +2135,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.2" +version = "0.8.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.2-py3-none-linux_armv6l.whl", hash = "sha256:c49ab4da37e7c457105aadfd2725e24305ff9bc908487a9bf8d548c6dad8bb3d"}, - {file = "ruff-0.8.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec016beb69ac16be416c435828be702ee694c0d722505f9c1f35e1b9c0cc1bf5"}, - {file = "ruff-0.8.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f05cdf8d050b30e2ba55c9b09330b51f9f97d36d4673213679b965d25a785f3c"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60f578c11feb1d3d257b2fb043ddb47501ab4816e7e221fbb0077f0d5d4e7b6f"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbd5cf9b0ae8f30eebc7b360171bd50f59ab29d39f06a670b3e4501a36ba5897"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b402ddee3d777683de60ff76da801fa7e5e8a71038f57ee53e903afbcefdaa58"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:705832cd7d85605cb7858d8a13d75993c8f3ef1397b0831289109e953d833d29"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32096b41aaf7a5cc095fa45b4167b890e4c8d3fd217603f3634c92a541de7248"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e769083da9439508833cfc7c23e351e1809e67f47c50248250ce1ac52c21fb93"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe716592ae8a376c2673fdfc1f5c0c193a6d0411f90a496863c99cd9e2ae25d"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:81c148825277e737493242b44c5388a300584d73d5774defa9245aaef55448b0"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d261d7850c8367704874847d95febc698a950bf061c9475d4a8b7689adc4f7fa"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1ca4e3a87496dc07d2427b7dd7ffa88a1e597c28dad65ae6433ecb9f2e4f022f"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:729850feed82ef2440aa27946ab39c18cb4a8889c1128a6d589ffa028ddcfc22"}, - {file = "ruff-0.8.2-py3-none-win32.whl", hash = "sha256:ac42caaa0411d6a7d9594363294416e0e48fc1279e1b0e948391695db2b3d5b1"}, - {file = "ruff-0.8.2-py3-none-win_amd64.whl", hash = "sha256:2aae99ec70abf43372612a838d97bfe77d45146254568d94926e8ed5bbb409ea"}, - {file = "ruff-0.8.2-py3-none-win_arm64.whl", hash = "sha256:fb88e2a506b70cfbc2de6fae6681c4f944f7dd5f2fe87233a7233d888bad73e8"}, - {file = "ruff-0.8.2.tar.gz", hash = "sha256:b84f4f414dda8ac7f75075c1fa0b905ac0ff25361f42e6d5da681a465e0f78e5"}, + {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, + {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, + {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, + {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, + {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, + {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, + {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, ] [[package]] @@ -2414,4 +2414,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "19465d40ffacb007e20b369a30a8209a62413742686ad11679e5d32a658017ca" +content-hash = "6396dc4ab6d72485a70114af26bcae24c090e264f555cf809ea1c51ac0194212" diff --git a/pykanidm/pyproject.toml b/pykanidm/pyproject.toml index 269058ece..97c2c0db3 100644 --- a/pykanidm/pyproject.toml +++ b/pykanidm/pyproject.toml @@ -34,7 +34,7 @@ types-toml = "^0.10.8" pylint-pydantic = "^0.3.4" coverage = "^7.6.9" pylint-pytest = "^1.1.7" -pytest-asyncio = "^0.24.0" +pytest-asyncio = "^0.25.0" pytest-mock = "^3.14.0" pytest-aiohttp = "^1.0.5" black = "^24.10.0" @@ -45,7 +45,7 @@ mkdocstrings-python = "^1.12.2" pook = "^2.1.2" [tool.poetry.group.dev.dependencies] -ruff = ">=0.5.1,<0.8.3" +ruff = ">=0.5.1,<0.8.4" [build-system] requires = ["poetry-core>=1.0.0"] From 6abdb12e351dc60e6e329c02a40719c5bfd4a8b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 07:50:01 +1000 Subject: [PATCH 14/87] Bump mozilla-actions/sccache-action from 0.0.6 to 0.0.7 in the all group (#3295) Bumps the all group with 1 update: [mozilla-actions/sccache-action](https://github.com/mozilla-actions/sccache-action). Updates `mozilla-actions/sccache-action` from 0.0.6 to 0.0.7 - [Release notes](https://github.com/mozilla-actions/sccache-action/releases) - [Commits](https://github.com/mozilla-actions/sccache-action/compare/v0.0.6...v0.0.7) --- updated-dependencies: - dependency-name: mozilla-actions/sccache-action dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/clippy.yml | 4 ++-- .github/workflows/kanidm_individual_book.yml | 2 +- .github/workflows/rust_build.yml | 6 +++--- .github/workflows/windows_build.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index c28a635ca..a3710d26f 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" - name: Install dependencies @@ -39,7 +39,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" - name: "Run cargo fmt" diff --git a/.github/workflows/kanidm_individual_book.yml b/.github/workflows/kanidm_individual_book.yml index 763181979..a9173522d 100644 --- a/.github/workflows/kanidm_individual_book.yml +++ b/.github/workflows/kanidm_individual_book.yml @@ -24,7 +24,7 @@ jobs: with: ref: ${{ inputs.tag }} - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" - name: Install deps diff --git a/.github/workflows/rust_build.yml b/.github/workflows/rust_build.yml index 13e743f65..3bd4983e9 100644 --- a/.github/workflows/rust_build.yml +++ b/.github/workflows/rust_build.yml @@ -27,7 +27,7 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" @@ -74,7 +74,7 @@ jobs: with: toolchain: ${{ matrix.rust_version }} - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" @@ -116,7 +116,7 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" diff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml index 2737298c0..215d77331 100644 --- a/.github/workflows/windows_build.yml +++ b/.github/workflows/windows_build.yml @@ -28,7 +28,7 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Setup sccache - uses: mozilla-actions/sccache-action@v0.0.6 + uses: mozilla-actions/sccache-action@v0.0.7 with: version: "v0.4.2" - run: cargo build -p kanidm_client -p kanidm_tools --bin kanidm From 6db0cdc345532d48672ce230931b3e0115d50ebb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 22:17:05 +0000 Subject: [PATCH 15/87] Bump the all group with 6 updates (#3294) Bumps the all group with 6 updates: | Package | From | To | | --- | --- | --- | | [chrono](https://github.com/chronotope/chrono) | `0.4.38` | `0.4.39` | | [libc](https://github.com/rust-lang/libc) | `0.2.167` | `0.2.168` | | [rustls](https://github.com/rustls/rustls) | `0.23.19` | `0.23.20` | | [serde](https://github.com/serde-rs/serde) | `1.0.215` | `1.0.216` | | [tower](https://github.com/tower-rs/tower) | `0.5.1` | `0.5.2` | | [fantoccini](https://github.com/jonhoo/fantoccini) | `0.21.2` | `0.21.3` | Updates `chrono` from 0.4.38 to 0.4.39 - [Release notes](https://github.com/chronotope/chrono/releases) - [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md) - [Commits](https://github.com/chronotope/chrono/compare/v0.4.38...v0.4.39) Updates `libc` from 0.2.167 to 0.2.168 - [Release notes](https://github.com/rust-lang/libc/releases) - [Changelog](https://github.com/rust-lang/libc/blob/0.2.168/CHANGELOG.md) - [Commits](https://github.com/rust-lang/libc/compare/0.2.167...0.2.168) Updates `rustls` from 0.23.19 to 0.23.20 - [Release notes](https://github.com/rustls/rustls/releases) - [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md) - [Commits](https://github.com/rustls/rustls/compare/v/0.23.19...v/0.23.20) Updates `serde` from 1.0.215 to 1.0.216 - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.215...v1.0.216) Updates `tower` from 0.5.1 to 0.5.2 - [Release notes](https://github.com/tower-rs/tower/releases) - [Commits](https://github.com/tower-rs/tower/compare/tower-0.5.1...tower-0.5.2) Updates `fantoccini` from 0.21.2 to 0.21.3 - [Commits](https://github.com/jonhoo/fantoccini/compare/v0.21.2...v0.21.3) --- updated-dependencies: - dependency-name: chrono dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: rustls dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: tower dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: fantoccini dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 46 +++++++++++++++++++-------------------- Cargo.toml | 8 +++---- server/core/Cargo.toml | 2 +- server/testkit/Cargo.toml | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb638a6cc..be390d35f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,7 +389,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -452,7 +452,7 @@ dependencies = [ "multer", "pin-project-lite", "serde", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -773,9 +773,9 @@ checksum = "17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1525,9 +1525,9 @@ dependencies = [ [[package]] name = "fantoccini" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd52b63e98251013cd5a9e881b9d460fc530e5df4eec58930c9694d6497c53e5" +checksum = "8e681009c468d99de858e7757b0cfd5f16311ca999b13ccf543c87da3c04c2c5" dependencies = [ "base64 0.22.1", "cookie 0.18.1", @@ -2564,7 +2564,7 @@ dependencies = [ "http 1.2.0", "hyper 1.5.1", "hyper-util", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -3263,7 +3263,7 @@ dependencies = [ "tokio-openssl", "tokio-util", "toml", - "tower 0.5.1", + "tower 0.5.2", "tower-http", "tracing", "url", @@ -3452,9 +3452,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.167" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libloading" @@ -4571,7 +4571,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.0.0", - "rustls 0.23.19", + "rustls 0.23.20", "socket2", "thiserror", "tokio", @@ -4588,7 +4588,7 @@ dependencies = [ "rand", "ring", "rustc-hash 2.0.0", - "rustls 0.23.19", + "rustls 0.23.20", "slab", "thiserror", "tinyvec", @@ -4821,7 +4821,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.19", + "rustls 0.23.20", "rustls-native-certs", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -4983,9 +4983,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "once_cell", "ring", @@ -5179,9 +5179,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] @@ -5217,9 +5217,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", @@ -5817,7 +5817,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.19", + "rustls 0.23.20", "rustls-pki-types", "tokio", ] @@ -5923,14 +5923,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tokio", "tokio-stream", "tower-layer", diff --git a/Cargo.toml b/Cargo.toml index 9df46e583..f3086d524 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,7 +160,7 @@ bytes = "^1.9.0" clap = { version = "^4.5.23", features = ["derive", "env"] } clap_complete = "^4.5.38" # Forced by saffron/cron -chrono = "^0.4.35" +chrono = "^0.4.39" compact_jwt = { version = "^0.4.2", default-features = false } concread = "^0.5.3" cron = "0.12.1" @@ -196,7 +196,7 @@ lazy_static = "^1.5.0" ldap3_client = "^0.5.2" ldap3_proto = { version = "^0.5.2", features = ["serde"] } -libc = "^0.2.167" +libc = "^0.2.168" libnss = "^0.8.0" libsqlite3-sys = "^0.25.2" lodepng = "3.10.7" @@ -239,13 +239,13 @@ reqwest = { version = "0.12.9", default-features = false, features = [ "rustls-tls-native-roots", ] } rusqlite = { version = "^0.28.0", features = ["array", "bundled"] } -rustls = { version = "0.23.19", default-features = false, features = [ +rustls = { version = "0.23.20", default-features = false, features = [ "aws_lc_rs", ] } sd-notify = "^0.4.3" selinux = "^0.4.6" -serde = "^1.0.215" +serde = "^1.0.216" serde_cbor = { version = "0.12.0-dev", package = "serde_cbor_2" } serde_json = "^1.0.133" serde_urlencoded = "^0.7.1" diff --git a/server/core/Cargo.toml b/server/core/Cargo.toml index 417d30623..bfe846abb 100644 --- a/server/core/Cargo.toml +++ b/server/core/Cargo.toml @@ -57,7 +57,7 @@ tokio = { workspace = true, features = ["net", "sync", "io-util", "macros"] } tokio-openssl = { workspace = true } tokio-util = { workspace = true, features = ["codec"] } toml = { workspace = true } -tower = { version = "0.5.1", features = ["tokio-stream", "tracing"] } +tower = { version = "0.5.2", features = ["tokio-stream", "tracing"] } tower-http = { version = "0.6.2", features = [ "compression-gzip", "fs", diff --git a/server/testkit/Cargo.toml b/server/testkit/Cargo.toml index 6ab65a16f..7dae25abc 100644 --- a/server/testkit/Cargo.toml +++ b/server/testkit/Cargo.toml @@ -53,7 +53,7 @@ assert_cmd = "2.0.16" compact_jwt = { workspace = true } escargot = "0.5.13" # used for webdriver testing -fantoccini = { version = "0.21.2" } +fantoccini = { version = "0.21.3" } futures = { workspace = true } oauth2_ext = { workspace = true, default-features = false, features = [ "reqwest", From 5d75c9b247a0920e1dd6ac08661333cfd8f6f695 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Mon, 16 Dec 2024 09:43:29 +1000 Subject: [PATCH 16/87] Autocomplete password during reauth with TOTP (#3290) During a re-auth flow, the password was not autocompleted once totp was autocompleted. This is because in a normal login flow the autocomplete is performed on the first login.html page, but in a re-auth we skip that page. This adds the proper handling to allow the pw to autofill in the background once the TOTP is completed. --- server/core/src/https/views/login.rs | 29 ++++++++++++++++++++++++++- server/core/templates/login.html | 2 +- server/core/templates/login_totp.html | 11 ++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/server/core/src/https/views/login.rs b/server/core/src/https/views/login.rs index ce19a26f5..3b5c2b6ba 100644 --- a/server/core/src/https/views/login.rs +++ b/server/core/src/https/views/login.rs @@ -552,6 +552,8 @@ pub async fn view_login_mech_choose_post( #[derive(Debug, Clone, Deserialize)] pub struct LoginTotpForm { + #[serde(default, deserialize_with = "empty_string_as_none")] + password: Option, totp: String, } @@ -560,7 +562,7 @@ pub async fn view_login_totp_post( Extension(kopid): Extension, VerifiedClientInformation(client_auth_info): VerifiedClientInformation, DomainInfo(domain_info): DomainInfo, - jar: CookieJar, + mut jar: CookieJar, Form(login_totp_form): Form, ) -> Response { // trim leading and trailing white space. @@ -583,6 +585,31 @@ pub async fn view_login_totp_post( } }; + // In some flows the PW manager may not have autocompleted the pw until + // this point. This could be due to a re-auth flow which skips the username + // prompt, the use of remember-me+return which then skips the autocomplete. + // + // In the case the pw *is* bg filled, we need to add it to the session context + // here. + // + // It's probably not "optimal" to be getting the context out and signing it + // here to re-add it, but it also helps keep the flow neater in general. + + if let Some(password_autofill) = login_totp_form.password { + let mut session_context = + cookies::get_signed::(&state, &jar, COOKIE_AUTH_SESSION_ID) + .unwrap_or_default(); + + session_context.password = Some(password_autofill); + + // If we can't write this back to the jar, we warn and move on. + if let Ok(update_jar) = add_session_cookie(&state, jar.clone(), &session_context) { + jar = update_jar; + } else { + warn!("Unable to update session_context, ignoring..."); + } + } + let auth_cred = AuthCredential::Totp(totp); credential_step(state, kopid, jar, client_auth_info, auth_cred, domain_info).await } diff --git a/server/core/templates/login.html b/server/core/templates/login.html index 9a5b89e63..74b8e21c4 100644 --- a/server/core/templates/login.html +++ b/server/core/templates/login.html @@ -23,7 +23,7 @@ /> - +
+ + + + Date: Mon, 16 Dec 2024 10:28:00 +1000 Subject: [PATCH 17/87] Use specific errors for intent token revoked (#3291) Rather than the generic 'invalid state' error, we now return proper site-specific errors for credential commit failures, with error messages to explain what went wrong. --- proto/src/internal/error.rs | 16 +++++++++++++++- server/core/src/https/views/constants.rs | 2 ++ server/core/templates/unrecoverable_error.html | 3 ++- server/lib/src/idm/credupdatesession.rs | 7 +++---- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/proto/src/internal/error.rs b/proto/src/internal/error.rs index 2e2b35872..75a7d5711 100644 --- a/proto/src/internal/error.rs +++ b/proto/src/internal/error.rs @@ -152,6 +152,15 @@ pub enum OperationError { CU0001WebauthnAttestationNotTrusted, CU0002WebauthnRegistrationError, CU0003WebauthnUserNotVerified, + + // The session is inconsistent and can't be committed, but the errors + // can be resolved. + CU0004SessionInconsistent, + // Another session used this intent token, and so it can't be committed. + CU0005IntentTokenConflict, + // The intent token was invalidated before we could commit. + CU0006IntentTokenInvalidated, + // ValueSet errors VS0001IncomingReplSshPublicKey, VS0002CertificatePublicKeyDigest, @@ -295,7 +304,7 @@ impl Display for OperationError { impl OperationError { /// Return the message associated with the error if there is one. - fn message(&self) -> Option { + pub fn message(&self) -> Option { match self { Self::SessionExpired => None, Self::EmptyRequest => None, @@ -364,6 +373,11 @@ impl OperationError { Self::CU0001WebauthnAttestationNotTrusted => None, Self::CU0002WebauthnRegistrationError => None, Self::CU0003WebauthnUserNotVerified => Some("User Verification bit not set while registering credential, you may need to configure a PIN on this device.".into()), + + Self::CU0004SessionInconsistent => Some("The session is unable to be committed due to unresolved warnings.".into()), + Self::CU0005IntentTokenConflict => Some("The intent token used to create this session has been reused in another browser/tab and may not proceed.".into()), + Self::CU0006IntentTokenInvalidated => Some("The intent token has been invalidated/revoked before the commit could be accepted. Has it been used in another browser or tab?".into()), + Self::DB0001MismatchedRestoreVersion => None, Self::DB0002MismatchedRestoreVersion => None, Self::DB0003FilterResolveCacheBuild => None, diff --git a/server/core/src/https/views/constants.rs b/server/core/src/https/views/constants.rs index d04737ce7..3d3811015 100644 --- a/server/core/src/https/views/constants.rs +++ b/server/core/src/https/views/constants.rs @@ -24,6 +24,7 @@ impl std::fmt::Display for UiMessage { pub(crate) enum Urls { Apps, CredReset, + CredResetError, Profile, UpdateCredentials, Oauth2Resume, @@ -36,6 +37,7 @@ impl AsRef for Urls { match self { Self::Apps => "/ui/apps", Self::CredReset => "/ui/reset", + Self::CredResetError => "/ui/reset/err", Self::Profile => "/ui/profile", Self::UpdateCredentials => "/ui/update_credentials", Self::Oauth2Resume => "/ui/oauth2/resume", diff --git a/server/core/templates/unrecoverable_error.html b/server/core/templates/unrecoverable_error.html index 068d8fc89..39d6b9098 100644 --- a/server/core/templates/unrecoverable_error.html +++ b/server/core/templates/unrecoverable_error.html @@ -9,8 +9,9 @@

Error

An unrecoverable error occurred. Please contact your administrator with the details below.

-

Error Code: (( err_code ))

Operation ID: (( operation_id ))

+

Error Code: (( err_code ))

+ Return
(% endblock %) diff --git a/server/lib/src/idm/credupdatesession.rs b/server/lib/src/idm/credupdatesession.rs index 540061480..6e949d207 100644 --- a/server/lib/src/idm/credupdatesession.rs +++ b/server/lib/src/idm/credupdatesession.rs @@ -1311,8 +1311,7 @@ impl IdmServerProxyWriteTransaction<'_> { "Session is unable to commit due to: {}", commit_failure_reasons ); - // TODO: perhaps it would be more helpful to add a new operation error that describes what the issue is - return Err(OperationError::InvalidState); + return Err(OperationError::CU0004SessionInconsistent); } // Setup mods for the various bits. We always assert an *exact* state. @@ -1339,7 +1338,7 @@ impl IdmServerProxyWriteTransaction<'_> { }) => { if *session_id != session_token.sessionid { security_info!("Session originated from an intent token, but the intent token has initiated a conflicting second update session. Refusing to commit changes."); - return Err(OperationError::InvalidState); + return Err(OperationError::CU0005IntentTokenConflict); } else { *max_ttl } @@ -1351,7 +1350,7 @@ impl IdmServerProxyWriteTransaction<'_> { }) | None => { security_info!("Session originated from an intent token, but the intent token has transitioned to an invalid state. Refusing to commit changes."); - return Err(OperationError::InvalidState); + return Err(OperationError::CU0006IntentTokenInvalidated); } }; From 7e9c33ab036b71e42a9adfaea12f6f0599b4d3b7 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Tue, 17 Dec 2024 11:37:16 +1000 Subject: [PATCH 18/87] Limit OAuth2 resumption to session (#3296) OAuth2 session resumption was accidentally made a permanent cookie which led to continuing issues with it causing invalid redirections after login. Make this a session only cookie. --- proto/src/internal/error.rs | 34 ++++++++++++++------------ server/core/src/https/views/cookies.rs | 9 ------- server/core/src/https/views/login.rs | 7 ++++-- server/core/src/https/views/oauth2.rs | 6 ++++- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/proto/src/internal/error.rs b/proto/src/internal/error.rs index 75a7d5711..2fe30a42a 100644 --- a/proto/src/internal/error.rs +++ b/proto/src/internal/error.rs @@ -268,6 +268,7 @@ pub enum OperationError { // Web UI UI0001ChallengeSerialisation, UI0002InvalidState, + UI0003InvalidOauth2Resume, // Unixd Things KU001InitWhileSessionActive, @@ -457,25 +458,26 @@ impl OperationError { Self::SC0009IndexTypeSyntaxInvalid => Some("A SCIM IndexType contained invalid syntax".into()), Self::SC0010DateTimeSyntaxInvalid => Some("A SCIM DateTime contained invalid syntax".into()), - Self::SC0011AddressSyntaxInvalid => Some("A SCIM Address contained invalid syntax".into()), - Self::SC0012CertificateSyntaxInvalid => Some("A SCIM Certificate contained invalid binary data".into()), - Self::SC0013CertificateInvalidDer => Some("A SCIM Certificate did not contain valid DER".into()), - Self::SC0014CertificateInvalidDigest => Some("A SCIM Certificate was unable to be digested".into()), - Self::SC0015CredentialTypeSyntaxInvalid => Some("A SCIM CredentialType contained invalid syntax".into()), - Self::SC0016InameSyntaxInvalid => Some("A SCIM Iname string contained invalid syntax".into()), - Self::SC0017Iutf8SyntaxInvalid => Some("A SCIM Iutf8 string contained invalid syntax".into()), - Self::SC0018NsUniqueIdSyntaxInvalid => Some("A SCIM NsUniqueID contained invalid syntax".into()), - Self::SC0019Oauth2ScopeSyntaxInvalid => Some("A SCIM Oauth2 Scope contained invalid syntax".into()), - Self::SC0020Oauth2ScopeMapSyntaxInvalid => Some("A SCIM Oauth2 Scope Map contained invalid syntax".into()), - Self::SC0021Oauth2ScopeMapMissingGroupIdentifier => Some("A SCIM Oauth2 Scope Map was missing a group name or uuid".into()), - Self::SC0022Oauth2ClaimMapSyntaxInvalid => Some("A SCIM Oauth2 Claim Map contained invalid syntax".into()), - Self::SC0023Oauth2ClaimMapMissingGroupIdentifier => Some("A SCIM Claim Map was missing a group name or uuid".into()), - Self::SC0024SshPublicKeySyntaxInvalid => Some("A SCIM Ssh Public Key contained invalid syntax".into()), - Self::SC0025UiHintSyntaxInvalid => Some("A SCIM UiHint contained invalid syntax".into()), - Self::SC0026Utf8SyntaxInvalid => Some("A SCIM Utf8 String Scope Map contained invalid syntax".into()), + Self::SC0011AddressSyntaxInvalid => Some("A SCIM Address contained invalid syntax".into()), + Self::SC0012CertificateSyntaxInvalid => Some("A SCIM Certificate contained invalid binary data".into()), + Self::SC0013CertificateInvalidDer => Some("A SCIM Certificate did not contain valid DER".into()), + Self::SC0014CertificateInvalidDigest => Some("A SCIM Certificate was unable to be digested".into()), + Self::SC0015CredentialTypeSyntaxInvalid => Some("A SCIM CredentialType contained invalid syntax".into()), + Self::SC0016InameSyntaxInvalid => Some("A SCIM Iname string contained invalid syntax".into()), + Self::SC0017Iutf8SyntaxInvalid => Some("A SCIM Iutf8 string contained invalid syntax".into()), + Self::SC0018NsUniqueIdSyntaxInvalid => Some("A SCIM NsUniqueID contained invalid syntax".into()), + Self::SC0019Oauth2ScopeSyntaxInvalid => Some("A SCIM Oauth2 Scope contained invalid syntax".into()), + Self::SC0020Oauth2ScopeMapSyntaxInvalid => Some("A SCIM Oauth2 Scope Map contained invalid syntax".into()), + Self::SC0021Oauth2ScopeMapMissingGroupIdentifier => Some("A SCIM Oauth2 Scope Map was missing a group name or uuid".into()), + Self::SC0022Oauth2ClaimMapSyntaxInvalid => Some("A SCIM Oauth2 Claim Map contained invalid syntax".into()), + Self::SC0023Oauth2ClaimMapMissingGroupIdentifier => Some("A SCIM Claim Map was missing a group name or uuid".into()), + Self::SC0024SshPublicKeySyntaxInvalid => Some("A SCIM Ssh Public Key contained invalid syntax".into()), + Self::SC0025UiHintSyntaxInvalid => Some("A SCIM UiHint contained invalid syntax".into()), + Self::SC0026Utf8SyntaxInvalid => Some("A SCIM Utf8 String Scope Map contained invalid syntax".into()), Self::UI0001ChallengeSerialisation => Some("The WebAuthn challenge was unable to be serialised.".into()), Self::UI0002InvalidState => Some("The credential update process returned an invalid state transition.".into()), + Self::UI0003InvalidOauth2Resume => Some("The server attemped to resume OAuth2, but no OAuth2 session is in progress.".into()), Self::VL0001ValueSshPublicKeyString => None, Self::VS0001IncomingReplSshPublicKey => None, Self::VS0002CertificatePublicKeyDigest | diff --git a/server/core/src/https/views/cookies.rs b/server/core/src/https/views/cookies.rs index be2f817c8..7b1abc00e 100644 --- a/server/core/src/https/views/cookies.rs +++ b/server/core/src/https/views/cookies.rs @@ -10,11 +10,6 @@ pub fn destroy(jar: CookieJar, ck_id: &str) -> CookieJar { if let Some(ck) = jar.get(ck_id) { let mut ck = ck.clone(); ck.make_removal(); - /* - if let Some(path) = ck.path().cloned() { - ck.set_path(&path); - } - */ jar.add(ck) } else { jar @@ -37,8 +32,6 @@ pub fn make_unsigned<'a>( // then webauthn won't work anyway! token_cookie.set_domain(state.domain.clone()); token_cookie.set_path(path); - // These last forever. - token_cookie.make_permanent(); token_cookie } @@ -71,8 +64,6 @@ pub fn make_signed<'a, T: Serialize>( token_cookie.set_http_only(true); token_cookie.set_path(path); token_cookie.set_domain(state.domain.clone()); - // These last forever, we have our own internal expiration handling. - token_cookie.make_permanent(); Some(token_cookie) } diff --git a/server/core/src/https/views/login.rs b/server/core/src/https/views/login.rs index 3b5c2b6ba..da8d3fee3 100644 --- a/server/core/src/https/views/login.rs +++ b/server/core/src/https/views/login.rs @@ -926,22 +926,25 @@ async fn view_login_step( // Important - this can be make unsigned as token_str has it's own // signatures. - let bearer_cookie = cookies::make_unsigned( + let mut bearer_cookie = cookies::make_unsigned( &state, COOKIE_BEARER_TOKEN, token_str.clone(), "/", ); + // Important - can be permanent as the token has its own expiration time internally + bearer_cookie.make_permanent(); jar = if session_context.remember_me { // Important - can be unsigned as username is just for remember // me and no other purpose. - let username_cookie = cookies::make_unsigned( + let mut username_cookie = cookies::make_unsigned( &state, COOKIE_USERNAME, session_context.username.clone(), Urls::Login.as_ref(), ); + username_cookie.make_permanent(); jar.add(username_cookie) } else { jar diff --git a/server/core/src/https/views/oauth2.rs b/server/core/src/https/views/oauth2.rs index bea06985c..982f2414d 100644 --- a/server/core/src/https/views/oauth2.rs +++ b/server/core/src/https/views/oauth2.rs @@ -112,7 +112,7 @@ async fn oauth2_auth_req( return ( jar, UnrecoverableErrorView { - err_code: OperationError::InvalidState, + err_code: OperationError::UI0003InvalidOauth2Resume, operation_id: kopid.eventid, }, ) @@ -176,6 +176,10 @@ async fn oauth2_auth_req( cookies::make_signed(&state, COOKIE_OAUTH2_REQ, &auth_req, Urls::Ui.as_ref()) .map(|mut cookie| { cookie.set_same_site(SameSite::Strict); + // Expire at the end of the session. + cookie.set_expires(None); + // Could experiment with this to a shorter value, but session should be enough. + cookie.set_max_age(None); jar.add(cookie) }) .ok_or(OperationError::InvalidSessionState); From eba8dff23a0d84bce78af7aa0f2884d7dbe0ac6e Mon Sep 17 00:00:00 2001 From: Firstyear Date: Tue, 17 Dec 2024 13:08:17 +1000 Subject: [PATCH 19/87] Ignore system users for UPG synthesiseation (#3297) Our unix resolver would attempt the right thing to synthesise user private groups on linux as these are an important security boundary. However, it turns out that almost every distro has botched their default system user accounts, and many are installed with numeric-only UPGs that don't resolve. In the case that later the user does attempt to fix that, because we synthesised as UPG for the system account, the user trying to add the UPG would now fail. In some cases this could cause system updates to be prevented from installing. This change limits UPG synth to user accounts only (uid > 1000) which is the common uid boundary on unix-like platforms. --- .../resolver/src/idprovider/system.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/unix_integration/resolver/src/idprovider/system.rs b/unix_integration/resolver/src/idprovider/system.rs index 3c11c3aff..a73db482c 100644 --- a/unix_integration/resolver/src/idprovider/system.rs +++ b/unix_integration/resolver/src/idprovider/system.rs @@ -8,6 +8,9 @@ use kanidm_unix_common::unix_passwd::{CryptPw, EtcGroup, EtcShadow, EtcUser}; use kanidm_unix_common::unix_proto::PamAuthRequest; use kanidm_unix_common::unix_proto::{NssGroup, NssUser}; +// The minimum GID that Kanidm will consider for creating a UPG +const SYSTEM_GID_BOUNDARY: u32 = 1000; + pub struct SystemProviderInternal { users: HashMap>, user_list: Vec>, @@ -223,22 +226,22 @@ impl SystemProvider { let uid = Id::Gid(user.uid); let gid = Id::Gid(user.gid); - if user.uid != user.gid { - error!(name = %user.name, uid = %user.uid, gid = %user.gid, "user uid and gid are not the same, this may be a security risk!"); - } - // Security checks. - if let Some(group) = system_ids_txn.groups.get(&gid) { + if user.uid != user.gid { + warn!(name = %user.name, uid = %user.uid, gid = %user.gid, "user uid and gid are not the same, this may be a security risk!"); + } else if let Some(group) = system_ids_txn.groups.get(&gid) { if group.name != user.name { - error!(name = %user.name, uid = %user.uid, gid = %user.gid, "user private group does not appear to have the same name as the user, this may be a security risk!"); + warn!(name = %user.name, uid = %user.uid, gid = %user.gid, "user private group does not appear to have the same name as the user, this may be a security risk!"); } if !(group.members.is_empty() || (group.members.len() == 1 && group.members.first() == Some(&user.name))) { - error!(name = %user.name, uid = %user.uid, gid = %user.gid, members = ?group.members, "user private group must not have members, THIS IS A SECURITY RISK!"); + warn!(name = %user.name, uid = %user.uid, gid = %user.gid, members = ?group.members, "user private group must not have members, THIS IS A SECURITY RISK!"); } + } else if user.uid < SYSTEM_GID_BOUNDARY { + warn!(name = %user.name, uid = %user.uid, gid = %user.gid, "user private group is not present on system, ignoring as this is a system account."); } else { - info!(name = %user.name, uid = %user.uid, gid = %user.gid, "user private group is not present on system, synthesising it"); + info!(name = %user.name, uid = %user.uid, gid = %user.gid, "user private group is not present on system, synthesising it."); let group = Arc::new(EtcGroup { name: user.name.clone(), password: String::new(), From 0b2f349aec55098e5794ca136cdfed702dba8723 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Tue, 17 Dec 2024 14:18:30 +1000 Subject: [PATCH 20/87] SCIM Sync Missing Annotation (#3300) A missing serde annotion in SCIM Sync caused groups to fail to sync unless they had a description. This resolves the failure by adding the correct annotation to skip None fields in groups. --- proto/src/scim_v1/synch.rs | 1 + tools/iam_migrations/freeipa/src/main.rs | 2 +- tools/iam_migrations/ldap/src/main.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/proto/src/scim_v1/synch.rs b/proto/src/scim_v1/synch.rs index 37e014d29..24a3adb81 100644 --- a/proto/src/scim_v1/synch.rs +++ b/proto/src/scim_v1/synch.rs @@ -220,6 +220,7 @@ pub struct ScimExternalMember { pub external_id: String, } +#[skip_serializing_none] #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "snake_case")] pub struct ScimSyncGroup { diff --git a/tools/iam_migrations/freeipa/src/main.rs b/tools/iam_migrations/freeipa/src/main.rs index fe19bc8ac..24f621c45 100644 --- a/tools/iam_migrations/freeipa/src/main.rs +++ b/tools/iam_migrations/freeipa/src/main.rs @@ -942,7 +942,7 @@ fn ipa_to_scim_entry( .build(); let scim_entry_generic: ScimEntry = scim_sync_person.try_into().map_err(|json_err| { - error!(?json_err, "Unable to convert group to scim_sync_group"); + error!(?json_err, "Unable to convert person to scim_sync_person"); })?; Ok(Some(scim_entry_generic)) diff --git a/tools/iam_migrations/ldap/src/main.rs b/tools/iam_migrations/ldap/src/main.rs index b912d5240..05e939632 100644 --- a/tools/iam_migrations/ldap/src/main.rs +++ b/tools/iam_migrations/ldap/src/main.rs @@ -633,7 +633,7 @@ fn ldap_to_scim_entry( .build(); let scim_entry_generic: ScimEntry = scim_sync_person.try_into().map_err(|json_err| { - error!(?json_err, "Unable to convert group to scim_sync_group"); + error!(?json_err, "Unable to convert person to scim_sync_person"); })?; Ok(Some(scim_entry_generic)) From 44e7348f3bf7f2491c96503bf53e553345be80b0 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Tue, 17 Dec 2024 16:57:26 +1000 Subject: [PATCH 21/87] Incorrect member name in groups (#3302) Member was accidentally set to members which prevented group synchronisation. --- proto/src/scim_v1/synch.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proto/src/scim_v1/synch.rs b/proto/src/scim_v1/synch.rs index 24a3adb81..ac359c5da 100644 --- a/proto/src/scim_v1/synch.rs +++ b/proto/src/scim_v1/synch.rs @@ -230,7 +230,7 @@ pub struct ScimSyncGroup { pub name: String, pub description: Option, pub gidnumber: Option, - pub members: Vec, + pub member: Vec, } impl TryInto for ScimSyncGroup { @@ -260,7 +260,7 @@ impl ScimSyncGroup { name, description: None, gidnumber: None, - members: Vec::with_capacity(0), + member: Vec::with_capacity(0), }, } } @@ -289,7 +289,7 @@ impl ScimSyncGroupBuilder { where I: Iterator, { - self.inner.members = member_iter + self.inner.member = member_iter .map(|external_id| ScimExternalMember { external_id }) .collect(); self From 1fbbf323fa8f57538dca3f69aae6bd7e258c6488 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Wed, 18 Dec 2024 17:43:56 +1000 Subject: [PATCH 22/87] Allow reseting account policy values to defaults (#3306) * Allow reseting account policy values to defaults This allows the admin cli to reset account policy values to defaults by clearing them. Due to how account policy resolves a lack of value implies the default. --- libs/client/src/group.rs | 57 +++++++++++++++++ tools/cli/src/cli/group/account_policy.rs | 76 +++++++++++++++++++++++ tools/cli/src/opt/kanidm.rs | 50 +++++++++++++++ 3 files changed, 183 insertions(+) diff --git a/libs/client/src/group.rs b/libs/client/src/group.rs index a1d426fa4..a33b98554 100644 --- a/libs/client/src/group.rs +++ b/libs/client/src/group.rs @@ -37,6 +37,14 @@ impl KanidmClient { .await } + pub async fn group_account_policy_authsession_expiry_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!("/v1/group/{}/_attr/authsession_expiry", id)) + .await + } + pub async fn group_account_policy_credential_type_minimum_set( &self, id: &str, @@ -61,6 +69,17 @@ impl KanidmClient { .await } + pub async fn group_account_policy_password_minimum_length_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!( + "/v1/group/{}/_attr/auth_password_minimum_length", + id + )) + .await + } + pub async fn group_account_policy_privilege_expiry_set( &self, id: &str, @@ -73,6 +92,14 @@ impl KanidmClient { .await } + pub async fn group_account_policy_privilege_expiry_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!("/v1/group/{}/_attr/privilege_expiry", id)) + .await + } + pub async fn group_account_policy_webauthn_attestation_set( &self, id: &str, @@ -85,6 +112,17 @@ impl KanidmClient { .await } + pub async fn group_account_policy_webauthn_attestation_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!( + "/v1/group/{}/_attr/webauthn_attestation_ca_list", + id + )) + .await + } + pub async fn group_account_policy_limit_search_max_results( &self, id: &str, @@ -97,6 +135,14 @@ impl KanidmClient { .await } + pub async fn group_account_policy_limit_search_max_results_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!("/v1/group/{}/_attr/limit_search_max_results", id)) + .await + } + pub async fn group_account_policy_limit_search_max_filter_test( &self, id: &str, @@ -109,6 +155,17 @@ impl KanidmClient { .await } + pub async fn group_account_policy_limit_search_max_filter_test_reset( + &self, + id: &str, + ) -> Result<(), ClientError> { + self.perform_delete_request(&format!( + "/v1/group/{}/_attr/limit_search_max_filter_test", + id + )) + .await + } + pub async fn group_account_policy_allow_primary_cred_fallback( &self, id: &str, diff --git a/tools/cli/src/cli/group/account_policy.rs b/tools/cli/src/cli/group/account_policy.rs index 1f5b6603d..d90aecc1e 100644 --- a/tools/cli/src/cli/group/account_policy.rs +++ b/tools/cli/src/cli/group/account_policy.rs @@ -12,6 +12,12 @@ impl GroupAccountPolicyOpt { | GroupAccountPolicyOpt::LimitSearchMaxResults { copt, .. } | GroupAccountPolicyOpt::LimitSearchMaxFilterTest { copt, .. } | GroupAccountPolicyOpt::AllowPrimaryCredFallback { copt, .. } + | GroupAccountPolicyOpt::ResetWebauthnAttestationCaList { copt, .. } + | GroupAccountPolicyOpt::ResetAuthSessionExpiry { copt, .. } + | GroupAccountPolicyOpt::ResetPasswordMinimumLength { copt, .. } + | GroupAccountPolicyOpt::ResetPrivilegedSessionExpiry { copt, .. } + | GroupAccountPolicyOpt::ResetLimitSearchMaxResults { copt, .. } + | GroupAccountPolicyOpt::ResetLimitSearchMaxFilterTest { copt, .. } | GroupAccountPolicyOpt::PrivilegedSessionExpiry { copt, .. } => copt.debug, } } @@ -37,6 +43,19 @@ impl GroupAccountPolicyOpt { println!("Updated authsession expiry."); } } + + GroupAccountPolicyOpt::ResetAuthSessionExpiry { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_authsession_expiry_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset authsession expiry."); + } + } + GroupAccountPolicyOpt::CredentialTypeMinimum { name, value, copt } => { let client = copt.to_client(OpType::Write).await; if let Err(e) = client @@ -59,6 +78,17 @@ impl GroupAccountPolicyOpt { println!("Updated password minimum length."); } } + GroupAccountPolicyOpt::ResetPasswordMinimumLength { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_password_minimum_length_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset password minimum length."); + } + } GroupAccountPolicyOpt::PrivilegedSessionExpiry { name, expiry, copt } => { let client = copt.to_client(OpType::Write).await; if let Err(e) = client @@ -70,6 +100,17 @@ impl GroupAccountPolicyOpt { println!("Updated privilege session expiry."); } } + GroupAccountPolicyOpt::ResetPrivilegedSessionExpiry { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_privilege_expiry_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset privilege session expiry."); + } + } GroupAccountPolicyOpt::WebauthnAttestationCaList { name, attestation_ca_list_json, @@ -85,6 +126,19 @@ impl GroupAccountPolicyOpt { println!("Updated webauthn attestation CA list."); } } + + GroupAccountPolicyOpt::ResetWebauthnAttestationCaList { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_webauthn_attestation_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset webauthn attestation CA list."); + } + } + GroupAccountPolicyOpt::LimitSearchMaxResults { name, maximum, @@ -100,6 +154,17 @@ impl GroupAccountPolicyOpt { println!("Updated search maximum results limit."); } } + GroupAccountPolicyOpt::ResetLimitSearchMaxResults { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_limit_search_max_results_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset search maximum results limit to default."); + } + } GroupAccountPolicyOpt::LimitSearchMaxFilterTest { name, maximum, @@ -115,6 +180,17 @@ impl GroupAccountPolicyOpt { println!("Updated search maximum filter test limit."); } } + GroupAccountPolicyOpt::ResetLimitSearchMaxFilterTest { name, copt } => { + let client = copt.to_client(OpType::Write).await; + if let Err(e) = client + .group_account_policy_limit_search_max_filter_test_reset(name) + .await + { + handle_client_error(e, copt.output_mode); + } else { + println!("Successfully reset search maximum filter test limit."); + } + } GroupAccountPolicyOpt::AllowPrimaryCredFallback { name, allow, copt } => { let client = copt.to_client(OpType::Write).await; if let Err(e) = client diff --git a/tools/cli/src/opt/kanidm.rs b/tools/cli/src/opt/kanidm.rs index a1f27f83c..7515205d0 100644 --- a/tools/cli/src/opt/kanidm.rs +++ b/tools/cli/src/opt/kanidm.rs @@ -197,6 +197,8 @@ pub enum GroupAccountPolicyOpt { #[clap(flatten)] copt: CommonOpt, }, + + /// Set the maximum time for privilege session expiry in seconds. #[clap(name = "privilege-expiry")] PrivilegedSessionExpiry { @@ -205,6 +207,8 @@ pub enum GroupAccountPolicyOpt { #[clap(flatten)] copt: CommonOpt, }, + + /// The WebAuthn attestation CA list that should be enforced /// on members of this group. Prevents use of passkeys that are /// not in this list. To create this list, use `fido-mds-tool` @@ -216,6 +220,7 @@ pub enum GroupAccountPolicyOpt { #[clap(flatten)] copt: CommonOpt, }, + /// Sets the maximum number of entries that may be returned in a /// search operation. #[clap(name = "limit-search-max-results")] @@ -245,6 +250,51 @@ pub enum GroupAccountPolicyOpt { #[clap(flatten)] copt: CommonOpt, }, + + /// Reset the maximum time for session expiry to its default value + #[clap(name = "reset-auth-expiry")] + ResetAuthSessionExpiry { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + /// Reset the minimum character length of passwords to its default value. + #[clap(name = "reset-password-minimum-length")] + ResetPasswordMinimumLength { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + /// Reset the maximum time for privilege session expiry to its default value. + #[clap(name = "reset-privilege-expiry")] + ResetPrivilegedSessionExpiry { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + /// Reset the WebAuthn attestation CA list to its default value + /// allowing any passkey to be used by members of this group. + #[clap(name = "reset-webauthn-attestation-ca-list")] + ResetWebauthnAttestationCaList { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + /// Reset the searche maxmium results limit to its default value. + #[clap(name = "reset-limit-search-max-results")] + ResetLimitSearchMaxResults { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + /// Reset the max filter test limit to its default value. + #[clap(name = "reset-limit-search-max-filter-test")] + ResetLimitSearchMaxFilterTest { + name: String, + #[clap(flatten)] + copt: CommonOpt, + }, + } #[derive(Debug, Subcommand)] From 50a7d9d700a98dc57e5224d95efda73eeff3b2d9 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Thu, 19 Dec 2024 13:30:35 +1000 Subject: [PATCH 23/87] Allow opt-in of easter eggs (#3308) So that we can start to add some more easter eggs to the server, we also need to respect user preferences that may not want them. This adds a configuration setting to the domain allowing a release build to opt-in to easter eggs, and development builds to opt-out of them. --- libs/client/src/domain.rs | 9 +++++ proto/src/attribute.rs | 3 ++ proto/src/constants.rs | 1 + server/lib/src/constants/acp.rs | 58 +++++++++++++++++++++++++++++ server/lib/src/constants/schema.rs | 32 ++++++++++++++++ server/lib/src/constants/uuids.rs | 2 + server/lib/src/server/migrations.rs | 3 ++ server/lib/src/server/mod.rs | 12 ++++++ tools/cli/src/cli/domain/mod.rs | 14 +++++++ tools/cli/src/opt/kanidm.rs | 9 +++++ 10 files changed, 143 insertions(+) diff --git a/libs/client/src/domain.rs b/libs/client/src/domain.rs index 50457e647..f0c766658 100644 --- a/libs/client/src/domain.rs +++ b/libs/client/src/domain.rs @@ -1,4 +1,5 @@ use crate::{ClientError, KanidmClient}; +use kanidm_proto::constants::ATTR_DOMAIN_ALLOW_EASTER_EGGS; use kanidm_proto::internal::ImageValue; use reqwest::multipart; @@ -8,6 +9,14 @@ impl KanidmClient { self.perform_delete_request("/v1/domain/_image").await } + pub async fn idm_set_domain_allow_easter_eggs(&self, enable: bool) -> Result<(), ClientError> { + self.perform_put_request( + &format!("{}{}", "/v1/domain/_attr/", ATTR_DOMAIN_ALLOW_EASTER_EGGS), + vec![enable.to_string()], + ) + .await + } + /// Add or update the domain logo/image pub async fn idm_domain_update_image(&self, image: ImageValue) -> Result<(), ClientError> { let file_content_type = image.filetype.as_content_type_str(); diff --git a/proto/src/attribute.rs b/proto/src/attribute.rs index 9e25c103b..f0c00e907 100644 --- a/proto/src/attribute.rs +++ b/proto/src/attribute.rs @@ -53,6 +53,7 @@ pub enum Attribute { DisplayName, Dn, Domain, + DomainAllowEasterEggs, DomainDevelopmentTaint, DomainDisplayName, DomainLdapBasedn, @@ -282,6 +283,7 @@ impl Attribute { Attribute::DisplayName => ATTR_DISPLAYNAME, Attribute::Dn => ATTR_DN, Attribute::Domain => ATTR_DOMAIN, + Attribute::DomainAllowEasterEggs => ATTR_DOMAIN_ALLOW_EASTER_EGGS, Attribute::DomainDevelopmentTaint => ATTR_DOMAIN_DEVELOPMENT_TAINT, Attribute::DomainDisplayName => ATTR_DOMAIN_DISPLAY_NAME, Attribute::DomainLdapBasedn => ATTR_DOMAIN_LDAP_BASEDN, @@ -464,6 +466,7 @@ impl Attribute { ATTR_DISPLAYNAME => Attribute::DisplayName, ATTR_DN => Attribute::Dn, ATTR_DOMAIN => Attribute::Domain, + ATTR_DOMAIN_ALLOW_EASTER_EGGS => Attribute::DomainAllowEasterEggs, ATTR_DOMAIN_DISPLAY_NAME => Attribute::DomainDisplayName, ATTR_DOMAIN_DEVELOPMENT_TAINT => Attribute::DomainDevelopmentTaint, ATTR_DOMAIN_LDAP_BASEDN => Attribute::DomainLdapBasedn, diff --git a/proto/src/constants.rs b/proto/src/constants.rs index b1ed216a9..c6d8b3b0a 100644 --- a/proto/src/constants.rs +++ b/proto/src/constants.rs @@ -89,6 +89,7 @@ pub const ATTR_DESCRIPTION: &str = "description"; pub const ATTR_DIRECTMEMBEROF: &str = "directmemberof"; pub const ATTR_DISPLAYNAME: &str = "displayname"; pub const ATTR_DN: &str = "dn"; +pub const ATTR_DOMAIN_ALLOW_EASTER_EGGS: &str = "domain_allow_easter_eggs"; pub const ATTR_DOMAIN_DEVELOPMENT_TAINT: &str = "domain_development_taint"; pub const ATTR_DOMAIN_DISPLAY_NAME: &str = "domain_display_name"; pub const ATTR_DOMAIN_LDAP_BASEDN: &str = "domain_ldap_basedn"; diff --git a/server/lib/src/constants/acp.rs b/server/lib/src/constants/acp.rs index 5868832e5..7c0487745 100644 --- a/server/lib/src/constants/acp.rs +++ b/server/lib/src/constants/acp.rs @@ -1129,6 +1129,64 @@ lazy_static! { }; } +lazy_static! { + pub static ref IDM_ACP_DOMAIN_ADMIN_DL9: BuiltinAcp = BuiltinAcp { + classes: vec![ + EntryClass::Object, + EntryClass::AccessControlProfile, + EntryClass::AccessControlModify, + EntryClass::AccessControlSearch + ], + name: "idm_acp_domain_admin", + uuid: UUID_IDM_ACP_DOMAIN_ADMIN_V1, + description: "Builtin IDM Control for granting domain info administration locally", + receiver: BuiltinAcpReceiver::Group(vec![UUID_DOMAIN_ADMINS]), + target: BuiltinAcpTarget::Filter(ProtoFilter::And(vec![ + ProtoFilter::Eq( + Attribute::Uuid.to_string(), + STR_UUID_DOMAIN_INFO.to_string() + ), + FILTER_ANDNOT_TOMBSTONE_OR_RECYCLED.clone() + ])), + search_attrs: vec![ + Attribute::Class, + Attribute::Name, + Attribute::Uuid, + Attribute::DomainAllowEasterEggs, + Attribute::DomainDisplayName, + Attribute::DomainName, + Attribute::DomainLdapBasedn, + Attribute::DomainSsid, + Attribute::DomainUuid, + Attribute::KeyInternalData, + Attribute::LdapAllowUnixPwBind, + Attribute::Version, + Attribute::Image, + ], + modify_removed_attrs: vec![ + Attribute::DomainDisplayName, + Attribute::DomainSsid, + Attribute::DomainLdapBasedn, + Attribute::DomainAllowEasterEggs, + Attribute::LdapAllowUnixPwBind, + Attribute::KeyActionRevoke, + Attribute::KeyActionRotate, + Attribute::Image, + ], + modify_present_attrs: vec![ + Attribute::DomainDisplayName, + Attribute::DomainLdapBasedn, + Attribute::DomainSsid, + Attribute::DomainAllowEasterEggs, + Attribute::LdapAllowUnixPwBind, + Attribute::KeyActionRevoke, + Attribute::KeyActionRotate, + Attribute::Image, + ], + ..Default::default() + }; +} + lazy_static! { pub static ref IDM_ACP_SYNC_ACCOUNT_MANAGE_V1: BuiltinAcp = BuiltinAcp { classes: vec![ diff --git a/server/lib/src/constants/schema.rs b/server/lib/src/constants/schema.rs index 19a9d9907..a5d943e34 100644 --- a/server/lib/src/constants/schema.rs +++ b/server/lib/src/constants/schema.rs @@ -770,6 +770,14 @@ pub static ref SCHEMA_ATTR_DOMAIN_DEVELOPMENT_TAINT_DL7: SchemaAttribute = Schem ..Default::default() }; +pub static ref SCHEMA_ATTR_DOMAIN_ALLOW_EASTER_EGGS_DL9: SchemaAttribute = SchemaAttribute { + uuid: UUID_SCHEMA_ATTR_DOMAIN_ALLOW_EASTER_EGGS, + name: Attribute::DomainAllowEasterEggs, + description: "A flag to enable easter eggs in the server that may not always be wanted by all users/deployments.".to_string(), + syntax: SyntaxType::Boolean, + ..Default::default() +}; + pub static ref SCHEMA_ATTR_REFERS_DL7: SchemaAttribute = SchemaAttribute { uuid: UUID_SCHEMA_ATTR_REFERS, name: Attribute::Refers, @@ -1177,6 +1185,30 @@ pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL8: SchemaClass = SchemaClass { ..Default::default() }; +pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL9: SchemaClass = SchemaClass { + uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO, + name: EntryClass::DomainInfo.into(), + description: "Local domain information and configuration".to_string(), + + systemmay: vec![ + Attribute::DomainSsid, + Attribute::DomainLdapBasedn, + Attribute::LdapAllowUnixPwBind, + Attribute::Image, + Attribute::PatchLevel, + Attribute::DomainDevelopmentTaint, + Attribute::DomainAllowEasterEggs, + ], + systemmust: vec![ + Attribute::Name, + Attribute::DomainUuid, + Attribute::DomainName, + Attribute::DomainDisplayName, + Attribute::Version, + ], + ..Default::default() +}; + pub static ref SCHEMA_CLASS_POSIXGROUP: SchemaClass = SchemaClass { uuid: UUID_SCHEMA_CLASS_POSIXGROUP, name: EntryClass::PosixGroup.into(), diff --git a/server/lib/src/constants/uuids.rs b/server/lib/src/constants/uuids.rs index f92e39389..708cd218b 100644 --- a/server/lib/src/constants/uuids.rs +++ b/server/lib/src/constants/uuids.rs @@ -321,6 +321,8 @@ pub const UUID_SCHEMA_ATTR_APPLICATION_PASSWORD: Uuid = pub const UUID_SCHEMA_ATTR_CREATED_AT_CID: Uuid = uuid!("00000000-0000-0000-0000-ffff00000184"); pub const UUID_SCHEMA_ATTR_ALLOW_PRIMARY_CRED_FALLBACK: Uuid = uuid!("00000000-0000-0000-0000-ffff00000185"); +pub const UUID_SCHEMA_ATTR_DOMAIN_ALLOW_EASTER_EGGS: Uuid = + uuid!("00000000-0000-0000-0000-ffff00000186"); // System and domain infos // I'd like to strongly criticise william of the past for making poor choices about these allocations. diff --git a/server/lib/src/server/migrations.rs b/server/lib/src/server/migrations.rs index e9fb0668b..b402df520 100644 --- a/server/lib/src/server/migrations.rs +++ b/server/lib/src/server/migrations.rs @@ -647,7 +647,9 @@ impl QueryServerWriteTransaction<'_> { // Now update schema let idm_schema_changes = [ SCHEMA_ATTR_OAUTH2_DEVICE_FLOW_ENABLE_DL9.clone().into(), + SCHEMA_ATTR_DOMAIN_ALLOW_EASTER_EGGS_DL9.clone().into(), SCHEMA_CLASS_OAUTH2_RS_DL9.clone().into(), + SCHEMA_CLASS_DOMAIN_INFO_DL9.clone().into(), ]; idm_schema_changes @@ -663,6 +665,7 @@ impl QueryServerWriteTransaction<'_> { let idm_data = [ IDM_ACP_OAUTH2_MANAGE_DL9.clone().into(), IDM_ACP_GROUP_MANAGE_DL9.clone().into(), + IDM_ACP_DOMAIN_ADMIN_DL9.clone().into(), ]; idm_data diff --git a/server/lib/src/server/mod.rs b/server/lib/src/server/mod.rs index a4bfec94f..f8ab0fc81 100644 --- a/server/lib/src/server/mod.rs +++ b/server/lib/src/server/mod.rs @@ -79,6 +79,7 @@ pub struct DomainInfo { pub(crate) d_patch_level: u32, pub(crate) d_devel_taint: bool, pub(crate) d_ldap_allow_unix_pw_bind: bool, + pub(crate) d_allow_easter_eggs: bool, // In future this should be image reference instead of the image itself. d_image: Option, } @@ -103,6 +104,10 @@ impl DomainInfo { pub fn has_custom_image(&self) -> bool { self.d_image.is_some() } + + pub fn allow_easter_eggs(&self) -> bool { + self.d_allow_easter_eggs + } } #[derive(Debug, Clone, PartialEq, Eq, Default)] @@ -1657,6 +1662,7 @@ impl QueryServer { // Automatically derive our current taint mode based on the PRERELEASE setting. d_devel_taint: option_env!("KANIDM_PRE_RELEASE").is_some(), d_ldap_allow_unix_pw_bind: false, + d_allow_easter_eggs: false, d_image: None, })); @@ -2284,6 +2290,11 @@ impl<'a> QueryServerWriteTransaction<'a> { .get_ava_single_bool(Attribute::DomainDevelopmentTaint) .unwrap_or_default(); + let domain_allow_easter_eggs = domain_info + .get_ava_single_bool(Attribute::DomainAllowEasterEggs) + // This defaults to false for release versions, and true in development + .unwrap_or(option_env!("KANIDM_PRE_RELEASE").is_some()); + // We have to set the domain version here so that features which check for it // will now see it's been increased. This also prevents recursion during reloads // inside of a domain migration. @@ -2293,6 +2304,7 @@ impl<'a> QueryServerWriteTransaction<'a> { mut_d_info.d_vers = domain_info_version; mut_d_info.d_patch_level = domain_info_patch_level; mut_d_info.d_devel_taint = domain_info_devel_taint; + mut_d_info.d_allow_easter_eggs = domain_allow_easter_eggs; // We must both be at the correct domain version *and* the correct patch level. If we are // not, then we only proceed to migrate *if* our server boot phase is correct. diff --git a/tools/cli/src/cli/domain/mod.rs b/tools/cli/src/cli/domain/mod.rs index 9ad264d0a..70067a50d 100644 --- a/tools/cli/src/cli/domain/mod.rs +++ b/tools/cli/src/cli/domain/mod.rs @@ -12,6 +12,7 @@ impl DomainOpt { | DomainOpt::SetImage { copt, .. } | DomainOpt::RemoveImage { copt } | DomainOpt::SetLdapAllowUnixPasswordBind { copt, .. } + | DomainOpt::SetAllowEasterEggs { copt, .. } | DomainOpt::RevokeKey { copt, .. } | DomainOpt::Show(copt) => copt.debug, } @@ -51,6 +52,19 @@ impl DomainOpt { Err(e) => handle_client_error(e, copt.output_mode), } } + DomainOpt::SetAllowEasterEggs { copt, enable } => { + let client = copt.to_client(OpType::Write).await; + match client.idm_set_domain_allow_easter_eggs(*enable).await { + Ok(_) => { + if *enable { + println!("Success 🎉 🥚 🎉") + } else { + println!("Success") + } + } + Err(e) => handle_client_error(e, copt.output_mode), + } + } DomainOpt::Show(copt) => { let client = copt.to_client(OpType::Read).await; match client.idm_domain_get().await { diff --git a/tools/cli/src/opt/kanidm.rs b/tools/cli/src/opt/kanidm.rs index 7515205d0..83a61fe4c 100644 --- a/tools/cli/src/opt/kanidm.rs +++ b/tools/cli/src/opt/kanidm.rs @@ -1332,6 +1332,15 @@ pub enum DomainOpt { #[clap(name = "allow", action = clap::ArgAction::Set)] enable: bool, }, + /// Enable or disable easter eggs in the server. This includes seasonal icons, kanidm + /// birthday surprises and other fun components. Defaults to false for production releases + /// and true in development builds. + SetAllowEasterEggs { + #[clap(flatten)] + copt: CommonOpt, + #[clap(name = "allow", action = clap::ArgAction::Set)] + enable: bool, + }, #[clap(name = "show")] /// Show information about this system's domain Show(CommonOpt), From 11438a9dd51e0d2bbdb5740cc72bda0b6f4078ac Mon Sep 17 00:00:00 2001 From: William Brown Date: Tue, 17 Dec 2024 15:16:32 +1000 Subject: [PATCH 24/87] Improved Cookie Removal If a path isn't set then cookies aren't removed. More aggressively remove cookies when they are no longer required. --- server/core/src/https/views/cookies.rs | 11 +++-- server/core/src/https/views/login.rs | 33 +++++-------- server/core/src/https/views/oauth2.rs | 9 +--- server/core/src/https/views/reset.rs | 47 +++++++++++-------- .../templates/credentials_update_partial.html | 3 +- 5 files changed, 50 insertions(+), 53 deletions(-) diff --git a/server/core/src/https/views/cookies.rs b/server/core/src/https/views/cookies.rs index 7b1abc00e..966d0ee65 100644 --- a/server/core/src/https/views/cookies.rs +++ b/server/core/src/https/views/cookies.rs @@ -6,11 +6,16 @@ use compact_jwt::{Jws, JwsSigner}; use serde::de::DeserializeOwned; use serde::Serialize; +#[instrument(name = "views::cookies::destroy", level = "debug", skip(jar))] pub fn destroy(jar: CookieJar, ck_id: &str) -> CookieJar { if let Some(ck) = jar.get(ck_id) { - let mut ck = ck.clone(); - ck.make_removal(); - jar.add(ck) + let mut removal_cookie = ck.clone(); + removal_cookie.make_removal(); + // Need to be set to / to remove on all parent paths. + // If you don't set a path, NOTHING IS REMOVED!!! + removal_cookie.set_path("/"); + + jar.add(removal_cookie) } else { jar } diff --git a/server/core/src/https/views/login.rs b/server/core/src/https/views/login.rs index da8d3fee3..7a54f1a0d 100644 --- a/server/core/src/https/views/login.rs +++ b/server/core/src/https/views/login.rs @@ -15,6 +15,7 @@ use axum::{ use axum_extra::extract::cookie::{Cookie, CookieJar, SameSite}; use kanidm_proto::internal::{ COOKIE_AUTH_SESSION_ID, COOKIE_BEARER_TOKEN, COOKIE_OAUTH2_REQ, COOKIE_USERNAME, + COOKIE_CU_SESSION_TOKEN }; use kanidm_proto::v1::{ AuthAllowed, AuthCredential, AuthIssueSession, AuthMech, AuthRequest, AuthStep, @@ -161,7 +162,7 @@ pub async fn view_logout_get( Extension(kopid): Extension, mut jar: CookieJar, ) -> Response { - if let Err(err_code) = state + let response = if let Err(err_code) = state .qe_w_ref .handle_logout(client_auth_info, kopid.eventid) .await @@ -172,12 +173,16 @@ pub async fn view_logout_get( } .into_response() } else { - let response = Redirect::to(Urls::Login.as_ref()).into_response(); + Redirect::to(Urls::Login.as_ref()).into_response() + }; - jar = cookies::destroy(jar, COOKIE_BEARER_TOKEN); + // Always clear cookies even on an error. + jar = cookies::destroy(jar, COOKIE_BEARER_TOKEN); + jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); + jar = cookies::destroy(jar, COOKIE_AUTH_SESSION_ID); + jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); - (jar, response).into_response() - } + (jar, response).into_response() } pub async fn view_reauth_get( @@ -190,14 +195,7 @@ pub async fn view_reauth_get( ) -> Response { // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = if let Some(authreq_cookie) = jar.get(COOKIE_OAUTH2_REQ) { - let mut authreq_cookie = authreq_cookie.clone(); - authreq_cookie.make_removal(); - authreq_cookie.set_path(Urls::Ui.as_ref()); - jar.add(authreq_cookie) - } else { - jar - }; + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); let session_valid_result = state .qe_r_ref @@ -324,14 +322,7 @@ pub async fn view_index_get( // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = if let Some(authreq_cookie) = jar.get(COOKIE_OAUTH2_REQ) { - let mut authreq_cookie = authreq_cookie.clone(); - authreq_cookie.make_removal(); - authreq_cookie.set_path(Urls::Ui.as_ref()); - jar.add(authreq_cookie) - } else { - jar - }; + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); match session_valid_result { Ok(()) => { diff --git a/server/core/src/https/views/oauth2.rs b/server/core/src/https/views/oauth2.rs index 982f2414d..ce0a7de7c 100644 --- a/server/core/src/https/views/oauth2.rs +++ b/server/core/src/https/views/oauth2.rs @@ -96,14 +96,7 @@ async fn oauth2_auth_req( ) -> Response { // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = if let Some(authreq_cookie) = jar.get(COOKIE_OAUTH2_REQ) { - let mut authreq_cookie = authreq_cookie.clone(); - authreq_cookie.make_removal(); - authreq_cookie.set_path(Urls::Ui.as_ref()); - jar.add(authreq_cookie) - } else { - jar - }; + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); // If the auth_req was cross-signed, old, or just bad, error. But we have *cleared* it // from the cookie which means we won't see it again. diff --git a/server/core/src/https/views/reset.rs b/server/core/src/https/views/reset.rs index 60f2ef7bc..d64b6cdf4 100644 --- a/server/core/src/https/views/reset.rs +++ b/server/core/src/https/views/reset.rs @@ -3,7 +3,7 @@ use axum::extract::{Query, State}; use axum::http::{StatusCode, Uri}; use axum::response::{ErrorResponse, IntoResponse, Redirect, Response}; use axum::{Extension, Form}; -use axum_extra::extract::cookie::{Cookie, SameSite}; +use axum_extra::extract::cookie::SameSite; use axum_extra::extract::CookieJar; use axum_htmx::{ HxEvent, HxLocation, HxPushUrl, HxRequest, HxReselect, HxResponseTrigger, HxReswap, HxRetarget, @@ -30,6 +30,7 @@ use super::navbar::NavbarCtx; use crate::https::extractors::{DomainInfo, DomainInfoRead, VerifiedClientInformation}; use crate::https::middleware::KOpId; use crate::https::views::constants::ProfileMenuItems; +use crate::https::views::cookies; use crate::https::views::errors::HtmxError; use crate::https::views::login::{LoginDisplayCtx, Reauth, ReauthPurpose}; use crate::https::ServerState; @@ -210,7 +211,7 @@ pub(crate) async fn commit( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; state .qe_w_ref @@ -218,7 +219,10 @@ pub(crate) async fn commit( .map_err(|op_err| HtmxError::new(&kopid, op_err)) .await?; - Ok((HxLocation::from(Uri::from_static("/ui")), "").into_response()) + // No longer need the cookie jar. + let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + + Ok((jar, HxLocation::from(Uri::from_static("/ui")), "").into_response()) } pub(crate) async fn cancel_cred_update( @@ -228,7 +232,7 @@ pub(crate) async fn cancel_cred_update( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; state .qe_w_ref @@ -236,7 +240,11 @@ pub(crate) async fn cancel_cred_update( .map_err(|op_err| HtmxError::new(&kopid, op_err)) .await?; + // No longer need the cookie jar. + let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + Ok(( + jar, HxLocation::from(Uri::from_static(Urls::Profile.as_ref())), "", ) @@ -250,7 +258,7 @@ pub(crate) async fn cancel_mfareg( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let cu_status = state .qe_r_ref @@ -268,7 +276,7 @@ pub(crate) async fn remove_alt_creds( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let cu_status = state .qe_r_ref @@ -286,7 +294,7 @@ pub(crate) async fn remove_unixcred( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let cu_status = state .qe_r_ref @@ -309,7 +317,7 @@ pub(crate) async fn remove_totp( jar: CookieJar, Form(totp): Form, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let cu_status = state .qe_r_ref @@ -332,7 +340,7 @@ pub(crate) async fn remove_passkey( jar: CookieJar, Form(passkey): Form, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let cu_status = state .qe_r_ref @@ -355,7 +363,7 @@ pub(crate) async fn finish_passkey( jar: CookieJar, Form(passkey_create): Form, ) -> axum::response::Result { - let cu_session_token = get_cu_session(jar).await?; + let cu_session_token = get_cu_session(&jar).await?; match serde_json::from_str(passkey_create.creation_data.as_str()) { Ok(creation_data) => { @@ -393,7 +401,7 @@ pub(crate) async fn view_new_passkey( jar: CookieJar, Form(init_form): Form, ) -> axum::response::Result { - let cu_session_token = get_cu_session(jar).await?; + let cu_session_token = get_cu_session(&jar).await?; let cu_req = match init_form.class { PasskeyClass::Any => CURequest::PasskeyInit, PasskeyClass::Attested => CURequest::AttestedPasskeyInit, @@ -445,7 +453,7 @@ pub(crate) async fn view_new_totp( VerifiedClientInformation(_client_auth_info): VerifiedClientInformation, jar: CookieJar, ) -> axum::response::Result { - let cu_session_token = get_cu_session(jar).await?; + let cu_session_token = get_cu_session(&jar).await?; let push_url = HxPushUrl(Uri::from_static("/ui/reset/add_totp")); let cu_status = state @@ -497,7 +505,7 @@ pub(crate) async fn add_totp( jar: CookieJar, new_totp_form: Form, ) -> axum::response::Result { - let cu_session_token = get_cu_session(jar).await?; + let cu_session_token = get_cu_session(&jar).await?; let check_totpcode = u32::from_str(&new_totp_form.check_totpcode).unwrap_or_default(); @@ -569,7 +577,7 @@ pub(crate) async fn view_new_pwd( jar: CookieJar, opt_form: Option>, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let swapped_handler_trigger = HxResponseTrigger::after_swap([HxEvent::new("addPasswordSwapped".to_string())]); @@ -679,10 +687,9 @@ fn add_cu_cookie( state: &ServerState, cu_session_token: CUSessionToken, ) -> CookieJar { - let mut token_cookie = Cookie::new(COOKIE_CU_SESSION_TOKEN, cu_session_token.token); - token_cookie.set_secure(state.secure_cookies); + let mut token_cookie = + cookies::make_unsigned(state, COOKIE_CU_SESSION_TOKEN, cu_session_token.token, "/"); token_cookie.set_same_site(SameSite::Strict); - token_cookie.set_http_only(true); jar.add(token_cookie) } @@ -694,7 +701,7 @@ pub(crate) async fn view_set_unixcred( jar: CookieJar, opt_form: Option>, ) -> axum::response::Result { - let cu_session_token: CUSessionToken = get_cu_session(jar).await?; + let cu_session_token: CUSessionToken = get_cu_session(&jar).await?; let swapped_handler_trigger = HxResponseTrigger::after_swap([HxEvent::new("addPasswordSwapped".to_string())]); @@ -781,7 +788,7 @@ pub(crate) async fn view_reset_get( | OperationError::InvalidState, ) => { // If our previous credential update session expired we want to see the reset form again. - jar = jar.remove(Cookie::from(COOKIE_CU_SESSION_TOKEN)); + jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); if let Some(token) = params.token { let token_uri_string = format!("{}?token={}", Urls::CredReset, token); @@ -917,7 +924,7 @@ fn get_cu_response( } } -async fn get_cu_session(jar: CookieJar) -> Result { +async fn get_cu_session(jar: &CookieJar) -> Result { let cookie = jar.get(COOKIE_CU_SESSION_TOKEN); if let Some(cookie) = cookie { let cu_session_token = cookie.value(); diff --git a/server/core/templates/credentials_update_partial.html b/server/core/templates/credentials_update_partial.html index c6b80128c..7dfdea067 100644 --- a/server/core/templates/credentials_update_partial.html +++ b/server/core/templates/credentials_update_partial.html @@ -147,7 +147,8 @@
+ hx-boost="false" + >Discard Changes From c59f560e50135fd3b8759acbbd58d0f1a9e0fd9c Mon Sep 17 00:00:00 2001 From: William Brown Date: Tue, 17 Dec 2024 16:25:19 +1000 Subject: [PATCH 25/87] Re-add enrol another device flow This was a commonly requested re-addition to the new webui. This adds the ability for someone to scan a qr code or follow a link to enrol another device to their account. --- server/core/src/https/mod.rs | 23 ++-- server/core/src/https/views/constants.rs | 3 + server/core/src/https/views/enrol.rs | 116 ++++++++++++++++++ server/core/src/https/views/login.rs | 4 +- server/core/src/https/views/mod.rs | 2 + server/core/static/img/icons/phone-flip.svg | 3 + .../credential_update_add_totp_partial.html | 3 +- server/core/templates/enrol_device.html | 17 +++ .../templates/user_settings_partial_base.html | 2 + 9 files changed, 162 insertions(+), 11 deletions(-) create mode 100644 server/core/src/https/views/enrol.rs create mode 100644 server/core/static/img/icons/phone-flip.svg create mode 100644 server/core/templates/enrol_device.html diff --git a/server/core/src/https/mod.rs b/server/core/src/https/mod.rs index d3cd43f5a..ae48307fa 100644 --- a/server/core/src/https/mod.rs +++ b/server/core/src/https/mod.rs @@ -53,6 +53,7 @@ use tokio::{ use tokio_openssl::SslStream; use tower::Service; use tower_http::{services::ServeDir, trace::TraceLayer}; +use url::Url; use uuid::Uuid; use std::io::ErrorKind; @@ -62,16 +63,17 @@ use std::{net::SocketAddr, str::FromStr}; #[derive(Clone)] pub struct ServerState { - pub status_ref: &'static StatusActor, - pub qe_w_ref: &'static QueryServerWriteV1, - pub qe_r_ref: &'static QueryServerReadV1, + pub(crate) status_ref: &'static StatusActor, + pub(crate) qe_w_ref: &'static QueryServerWriteV1, + pub(crate) qe_r_ref: &'static QueryServerReadV1, // Store the token management parts. - pub jws_signer: JwsHs256Signer, + pub(crate) jws_signer: JwsHs256Signer, pub(crate) trust_x_forward_for: bool, - pub csp_header: HeaderValue, - pub domain: String, + pub(crate) csp_header: HeaderValue, + pub(crate) origin: Url, + pub(crate) domain: String, // This is set to true by default, and is only false on integration tests. - pub secure_cookies: bool, + pub(crate) secure_cookies: bool, } impl ServerState { @@ -209,6 +211,12 @@ pub async fn create_https_server( let trust_x_forward_for = config.trust_x_forward_for; + let origin = Url::parse(&config.origin) + // Should be impossible! + .map_err(|err| { + error!(?err, "Unable to parse origin URL - refusing to start. You must correct the value for origin. {:?}", config.origin); + })?; + let state = ServerState { status_ref, qe_w_ref, @@ -216,6 +224,7 @@ pub async fn create_https_server( jws_signer, trust_x_forward_for, csp_header, + origin, domain: config.domain.clone(), secure_cookies: config.integration_test_config.is_none(), }; diff --git a/server/core/src/https/views/constants.rs b/server/core/src/https/views/constants.rs index 3d3811015..55c5f84aa 100644 --- a/server/core/src/https/views/constants.rs +++ b/server/core/src/https/views/constants.rs @@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize}; pub(crate) enum ProfileMenuItems { UserProfile, Credentials, + EnrolDevice, UnixPassword, } @@ -25,6 +26,7 @@ pub(crate) enum Urls { Apps, CredReset, CredResetError, + EnrolDevice, Profile, UpdateCredentials, Oauth2Resume, @@ -38,6 +40,7 @@ impl AsRef for Urls { Self::Apps => "/ui/apps", Self::CredReset => "/ui/reset", Self::CredResetError => "/ui/reset/err", + Self::EnrolDevice => "/ui/enrol", Self::Profile => "/ui/profile", Self::UpdateCredentials => "/ui/update_credentials", Self::Oauth2Resume => "/ui/oauth2/resume", diff --git a/server/core/src/https/views/enrol.rs b/server/core/src/https/views/enrol.rs new file mode 100644 index 000000000..abe35acab --- /dev/null +++ b/server/core/src/https/views/enrol.rs @@ -0,0 +1,116 @@ +use askama::Template; +use askama_axum::IntoResponse; + +use axum::extract::State; +use axum::response::Response; +use axum::Extension; + +use axum_extra::extract::CookieJar; +use kanidm_proto::internal::UserAuthToken; + +use qrcode::render::svg; +use qrcode::QrCode; +use url::Url; + +use std::time::Duration; + +use super::constants::Urls; +use super::navbar::NavbarCtx; +use crate::https::extractors::{DomainInfo, VerifiedClientInformation}; +use crate::https::middleware::KOpId; +use crate::https::views::constants::ProfileMenuItems; +use crate::https::views::errors::HtmxError; +use crate::https::views::login::{LoginDisplayCtx, Reauth, ReauthPurpose}; +use crate::https::ServerState; + +#[derive(Template)] +#[template(path = "user_settings.html")] +struct ProfileView { + navbar_ctx: NavbarCtx, + profile_partial: EnrolDeviceView, +} + +#[derive(Template)] +#[template(path = "enrol_device.html")] +pub(crate) struct EnrolDeviceView { + menu_active_item: ProfileMenuItems, + secret: String, + qr_code_svg: String, + uri: Url, +} + +pub(crate) async fn view_enrol_get( + State(state): State, + Extension(kopid): Extension, + VerifiedClientInformation(client_auth_info): VerifiedClientInformation, + DomainInfo(domain_info): DomainInfo, + jar: CookieJar, +) -> axum::response::Result { + let uat: UserAuthToken = state + .qe_r_ref + .handle_whoami_uat(client_auth_info.clone(), kopid.eventid) + .await + .map_err(|op_err| HtmxError::new(&kopid, op_err))?; + + let time = time::OffsetDateTime::now_utc() + time::Duration::new(60, 0); + let can_rw = uat.purpose_readwrite_active(time); + + // The user lacks an elevated session, request a re-auth. + if !can_rw { + let display_ctx = LoginDisplayCtx { + domain_info, + oauth2: None, + reauth: Some(Reauth { + username: uat.spn, + purpose: ReauthPurpose::ProfileSettings, + }), + error: None, + }; + + return Ok(super::login::view_reauth_get( + state, + client_auth_info, + kopid, + jar, + Urls::EnrolDevice.as_ref(), + display_ctx, + ) + .await); + } + + let cu_intent = state + .qe_w_ref + .handle_idmcredentialupdateintent( + client_auth_info, + uat.spn, + Some(Duration::from_secs(900)), + kopid.eventid, + ) + .await + .map_err(|op_err| HtmxError::new(&kopid, op_err))?; + + let secret = cu_intent.token; + + let mut uri = state.origin.clone(); + uri.set_path(Urls::CredReset.as_ref()); + uri.set_query(Some(format!("token={secret}").as_str())); + + let qr_code_svg = match QrCode::new(uri.as_str()) { + Ok(qr) => qr.render::().build(), + Err(qr_err) => { + error!("Failed to create TOTP QR code: {qr_err}"); + "QR Code Generation Failed".to_string() + } + }; + + Ok(ProfileView { + navbar_ctx: NavbarCtx { domain_info }, + profile_partial: EnrolDeviceView { + menu_active_item: ProfileMenuItems::EnrolDevice, + qr_code_svg, + secret, + uri, + }, + } + .into_response()) +} diff --git a/server/core/src/https/views/login.rs b/server/core/src/https/views/login.rs index 7a54f1a0d..ec6b7e38b 100644 --- a/server/core/src/https/views/login.rs +++ b/server/core/src/https/views/login.rs @@ -14,8 +14,8 @@ use axum::{ }; use axum_extra::extract::cookie::{Cookie, CookieJar, SameSite}; use kanidm_proto::internal::{ - COOKIE_AUTH_SESSION_ID, COOKIE_BEARER_TOKEN, COOKIE_OAUTH2_REQ, COOKIE_USERNAME, - COOKIE_CU_SESSION_TOKEN + COOKIE_AUTH_SESSION_ID, COOKIE_BEARER_TOKEN, COOKIE_CU_SESSION_TOKEN, COOKIE_OAUTH2_REQ, + COOKIE_USERNAME, }; use kanidm_proto::v1::{ AuthAllowed, AuthCredential, AuthIssueSession, AuthMech, AuthRequest, AuthStep, diff --git a/server/core/src/https/views/mod.rs b/server/core/src/https/views/mod.rs index 7fb53d472..a2d2da324 100644 --- a/server/core/src/https/views/mod.rs +++ b/server/core/src/https/views/mod.rs @@ -16,6 +16,7 @@ use crate::https::ServerState; mod apps; mod constants; mod cookies; +mod enrol; mod errors; mod login; mod navbar; @@ -37,6 +38,7 @@ pub fn view_router() -> Router { get(|| async { Redirect::permanent(Urls::Login.as_ref()) }), ) .route("/apps", get(apps::view_apps_get)) + .route("/enrol", get(enrol::view_enrol_get)) .route("/reset", get(reset::view_reset_get)) .route("/update_credentials", get(reset::view_self_reset_get)) .route("/profile", get(profile::view_profile_get)) diff --git a/server/core/static/img/icons/phone-flip.svg b/server/core/static/img/icons/phone-flip.svg new file mode 100644 index 000000000..1a144f27a --- /dev/null +++ b/server/core/static/img/icons/phone-flip.svg @@ -0,0 +1,3 @@ + + + diff --git a/server/core/templates/credential_update_add_totp_partial.html b/server/core/templates/credential_update_add_totp_partial.html index f9b1ec729..e9df734e6 100644 --- a/server/core/templates/credential_update_add_totp_partial.html +++ b/server/core/templates/credential_update_add_totp_partial.html @@ -1,8 +1,7 @@
(% if let Some(TotpInit with { secret, qr_code_svg, steps, digits, algo, uri }) = totp_init %) -
((qr_code_svg|safe)) -
+
((qr_code_svg|safe))
((uri|safe))

TOTP details

diff --git a/server/core/templates/enrol_device.html b/server/core/templates/enrol_device.html new file mode 100644 index 000000000..c314bdfdd --- /dev/null +++ b/server/core/templates/enrol_device.html @@ -0,0 +1,17 @@ +(% extends "user_settings_partial_base.html" %) + +(% block selected_setting_group %) +Enrol Another Device +(% endblock %) + +(% block settings_window %) +

You can enrol another device to your account by scanning the QR code or following the link below.

+ +
+
((qr_code_svg|safe))
+
    +
  • Url: ((uri|safe))
  • +
  • Secret: (( secret ))
  • +
+
+(% endblock %) diff --git a/server/core/templates/user_settings_partial_base.html b/server/core/templates/user_settings_partial_base.html index f091f4c31..b0490d456 100644 --- a/server/core/templates/user_settings_partial_base.html +++ b/server/core/templates/user_settings_partial_base.html @@ -20,6 +20,8 @@ ProfileMenuItems::UserProfile, "person") %) (% call side_menu_item("Credentials", (Urls::UpdateCredentials), ProfileMenuItems::Credentials, "shield-lock") %) + (% call side_menu_item("Enrol Device", (Urls::EnrolDevice), + ProfileMenuItems::EnrolDevice, "phone-flip") %)
From 4f2eb8b5f86c31b0c2cc85747959a4c6dfc0a27b Mon Sep 17 00:00:00 2001 From: Firstyear Date: Thu, 19 Dec 2024 15:46:15 +1000 Subject: [PATCH 26/87] Automatically trigger passkeys on login view (#3307) Add an on-load handler to pkhtml.js so that when the partial view is displayed passkey auth is automatically prompted for. If the users browser blocks this event, the fallback manual buttons still exist. --- server/core/static/pkhtml.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/core/static/pkhtml.js b/server/core/static/pkhtml.js index c6284aebe..3cff9f8fc 100644 --- a/server/core/static/pkhtml.js +++ b/server/core/static/pkhtml.js @@ -40,3 +40,8 @@ try { }); } catch (_error) {}; +try { + window.addEventListener("load", (event) => { + asskey_login() + }); +} catch (_error) {}; From 2174b9b251d88f9c2e0fc17478098a85576db1d2 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 19 Dec 2024 21:02:02 -0600 Subject: [PATCH 27/87] client: read attestation CA list JSON from file (#3232) instead of passing a giant blob of JSON as a command argument. Before, it was not possible to allow all valid authenticators certified by the FIDO Alliance because fido-mds-list query -o "status gte valid" outputs a JSON string longer than Linux allows for command arguments. Co-authored-by: Firstyear --- tools/cli/src/cli/group/account_policy.rs | 9 +++++++-- tools/cli/src/opt/kanidm.rs | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/cli/src/cli/group/account_policy.rs b/tools/cli/src/cli/group/account_policy.rs index d90aecc1e..3f6d0f49a 100644 --- a/tools/cli/src/cli/group/account_policy.rs +++ b/tools/cli/src/cli/group/account_policy.rs @@ -113,12 +113,17 @@ impl GroupAccountPolicyOpt { } GroupAccountPolicyOpt::WebauthnAttestationCaList { name, - attestation_ca_list_json, + attestation_ca_list_json_file, copt, } => { let client = copt.to_client(OpType::Write).await; + let json = std::fs::read_to_string(attestation_ca_list_json_file).unwrap_or_else(|e| { + error!("Could not read attestation CA list JSON file {attestation_ca_list_json_file:?}: {e:?}"); + std::process::exit(1); + }); + if let Err(e) = client - .group_account_policy_webauthn_attestation_set(name, attestation_ca_list_json) + .group_account_policy_webauthn_attestation_set(name, &json) .await { handle_client_error(e, copt.output_mode); diff --git a/tools/cli/src/opt/kanidm.rs b/tools/cli/src/opt/kanidm.rs index 83a61fe4c..1fb39d0ba 100644 --- a/tools/cli/src/opt/kanidm.rs +++ b/tools/cli/src/opt/kanidm.rs @@ -216,7 +216,7 @@ pub enum GroupAccountPolicyOpt { #[clap(name = "webauthn-attestation-ca-list")] WebauthnAttestationCaList { name: String, - attestation_ca_list_json: String, + attestation_ca_list_json_file: PathBuf, #[clap(flatten)] copt: CommonOpt, }, From c6432cad830c021e59e270b6cd8aa5dc4297c3b2 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 19 Dec 2024 21:18:52 -0600 Subject: [PATCH 28/87] book: explain how to use fido-mds-tool (#3231) explain how to use fido-mds-tool to configure Webauthn attestation --- book/src/accounts/account_policy.md | 41 ++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/book/src/accounts/account_policy.md b/book/src/accounts/account_policy.md index d7d4985b5..024006cf9 100644 --- a/book/src/accounts/account_policy.md +++ b/book/src/accounts/account_policy.md @@ -31,6 +31,8 @@ weakest to strongest: - `passkey` - `attested_passkey` +`attested_passkey` requires [configuring an allowlist of trusted authenticators](#setting-webauthn-attestation-ca-lists). + ### Password Minimum Length The minimum length for passwords (if they are allowed). @@ -45,7 +47,7 @@ read/write session. The list of certificate authorities and device aaguids that must be used by members of this policy. This allows limiting devices to specific models. -To generate this list you should use `fido-mds-tool`. +To generate this list you should [use `fido-mds-tool`](#setting-webauthn-attestation-ca-lists). ## Policy Resolution @@ -149,15 +151,42 @@ kanidm group account-policy privilege-expiry my_admin_group 86400 # NB: will be ### Setting Webauthn Attestation CA Lists -The list should be generated with `fido-mds-tool`. This will emit JSON that can be directly used -with Kanidm. +To verify Webauthn authenticators with attestation, Kanidm needs an allowlist of +authenticators to trust. Generate this list with the `fido-mds-tool` from +the [webauthn-rs project](https://github.com/kanidm/webauthn-rs). If you have a +Rust toolchain installed, it can built and installed from source with ```bash -kanidm group account-policy webauthn-attestation-ca-list -kanidm group account-policy webauthn-attestation-ca-list idm_all_persons '{"cas":{"D6E4b4Drh .... }' +cargo install fido-mds-tool ``` -> NOTE: `fido-mds-tool` is available in the `kanidm:tools` container. +Alternatively, `fido-mds-tool` is available in the +[tools container](../installing_client_tools.md#tools-container). + +First, fetch the MDS data provided by the FIDO Alliance: +```bash +fido-mds-tool fetch +``` + +Then, query the MDS data to generate your allowlist of authenticators. +For example, to trust all authenticators made by Yubico, run + +```bash +fido-mds-tool query --output-cert-roots "desc cnt yubikey" > trusted-authenticators +``` + +For details of how to query the MDS data, run + +```bash +fido-mds-tool query --help +``` + +Once you have generated the authenticator allowlist, use it to configure Kanidm's +account policy for a group. For example, to set the allowlist for all persons, run + +```bash +kanidm group account-policy webauthn-attestation-ca-list idm_all_persons trusted-authenticators +``` ## Global Settings From 9f499f3913485eef4d3afe49c1c203533af33a6c Mon Sep 17 00:00:00 2001 From: Firstyear Date: Fri, 20 Dec 2024 17:16:07 +1000 Subject: [PATCH 29/87] Further SCIM sync testing, minor fixes (#3305) This adds further testing of SCIM sync, especially around conversion of the SCIM Sync Person and Group types into SCIM Entry. This test would have prevented #3298 and #3299 from occuring. During testing two more fixes were found. external_id should have been required (not optional) and a group with no members would cause a serialisation issue. --- proto/src/scim_v1/mod.rs | 70 +++++++++-------- proto/src/scim_v1/synch.rs | 24 +++--- server/lib/src/idm/scim.rs | 98 +++++++++++++++++++++++- tools/iam_migrations/freeipa/src/main.rs | 9 +-- tools/iam_migrations/ldap/src/main.rs | 9 +-- 5 files changed, 146 insertions(+), 64 deletions(-) diff --git a/proto/src/scim_v1/mod.rs b/proto/src/scim_v1/mod.rs index 93333e69f..76b6c807d 100644 --- a/proto/src/scim_v1/mod.rs +++ b/proto/src/scim_v1/mod.rs @@ -120,12 +120,15 @@ mod tests { // Group let group_uuid = uuid::uuid!("2d0a9e7c-cc08-4ca2-8d7f-114f9abcfc8a"); - let group = ScimSyncGroup::builder("testgroup".to_string(), group_uuid) - .set_description(Some("test desc".to_string())) - .set_gidnumber(Some(12345)) - .set_members(vec!["member_a".to_string(), "member_a".to_string()].into_iter()) - .set_external_id(Some("cn=testgroup".to_string())) - .build(); + let group = ScimSyncGroup::builder( + group_uuid, + "cn=testgroup".to_string(), + "testgroup".to_string(), + ) + .set_description(Some("test desc".to_string())) + .set_gidnumber(Some(12345)) + .set_members(vec!["member_a".to_string(), "member_a".to_string()].into_iter()) + .build(); let entry: Result = group.try_into(); @@ -136,32 +139,35 @@ mod tests { let user_sshkey = "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBENubZikrb8hu+HeVRdZ0pp/VAk2qv4JDbuJhvD0yNdWDL2e3cBbERiDeNPkWx58Q4rVnxkbV1fa8E2waRtT91wAAAAEc3NoOg== testuser@fidokey"; - let person = - ScimSyncPerson::builder(user_uuid, "testuser".to_string(), "Test User".to_string()) - .set_password_import(Some("new_password".to_string())) - .set_unix_password_import(Some("new_password".to_string())) - .set_totp_import(vec![ScimTotp { - external_id: "Totp".to_string(), - secret: "abcd".to_string(), - algo: "SHA3".to_string(), - step: 60, - digits: 8, - }]) - .set_mail(vec![MultiValueAttr { - primary: Some(true), - value: "testuser@example.com".to_string(), - ..Default::default() - }]) - .set_ssh_publickey(vec![ScimSshPubKey { - label: "Key McKeyface".to_string(), - value: user_sshkey.to_string(), - }]) - .set_login_shell(Some("/bin/false".to_string())) - .set_account_valid_from(Some("2023-11-28T04:57:55Z".to_string())) - .set_account_expire(Some("2023-11-28T04:57:55Z".to_string())) - .set_gidnumber(Some(54321)) - .set_external_id(Some("cn=testuser".to_string())) - .build(); + let person = ScimSyncPerson::builder( + user_uuid, + "cn=testuser".to_string(), + "testuser".to_string(), + "Test User".to_string(), + ) + .set_password_import(Some("new_password".to_string())) + .set_unix_password_import(Some("new_password".to_string())) + .set_totp_import(vec![ScimTotp { + external_id: "Totp".to_string(), + secret: "abcd".to_string(), + algo: "SHA3".to_string(), + step: 60, + digits: 8, + }]) + .set_mail(vec![MultiValueAttr { + primary: Some(true), + value: "testuser@example.com".to_string(), + ..Default::default() + }]) + .set_ssh_publickey(vec![ScimSshPubKey { + label: "Key McKeyface".to_string(), + value: user_sshkey.to_string(), + }]) + .set_login_shell(Some("/bin/false".to_string())) + .set_account_valid_from(Some("2023-11-28T04:57:55Z".to_string())) + .set_account_expire(Some("2023-11-28T04:57:55Z".to_string())) + .set_gidnumber(Some(54321)) + .build(); let entry: Result = person.try_into(); diff --git a/proto/src/scim_v1/synch.rs b/proto/src/scim_v1/synch.rs index ac359c5da..30eeee9c7 100644 --- a/proto/src/scim_v1/synch.rs +++ b/proto/src/scim_v1/synch.rs @@ -119,7 +119,12 @@ pub struct ScimSyncPersonBuilder { } impl ScimSyncPerson { - pub fn builder(id: Uuid, name: String, displayname: String) -> ScimSyncPersonBuilder { + pub fn builder( + id: Uuid, + external_id: String, + name: String, + displayname: String, + ) -> ScimSyncPersonBuilder { ScimSyncPersonBuilder { inner: ScimSyncPerson { entry: ScimEntryHeader { @@ -128,7 +133,7 @@ impl ScimSyncPerson { SCIM_SCHEMA_SYNC_PERSON.to_string(), ], id, - external_id: None, + external_id: Some(external_id), meta: None, }, name, @@ -205,11 +210,6 @@ impl ScimSyncPersonBuilder { self } - pub fn set_external_id(mut self, external_id: Option) -> Self { - self.inner.entry.external_id = external_id; - self - } - pub fn build(self) -> ScimSyncPerson { self.inner } @@ -230,6 +230,7 @@ pub struct ScimSyncGroup { pub name: String, pub description: Option, pub gidnumber: Option, + #[serde(default, skip_serializing_if = "Vec::is_empty")] pub member: Vec, } @@ -248,13 +249,13 @@ pub struct ScimSyncGroupBuilder { } impl ScimSyncGroup { - pub fn builder(name: String, id: Uuid) -> ScimSyncGroupBuilder { + pub fn builder(id: Uuid, external_id: String, name: String) -> ScimSyncGroupBuilder { ScimSyncGroupBuilder { inner: ScimSyncGroup { entry: ScimEntryHeader { schemas: vec![SCIM_SCHEMA_SYNC_GROUP.to_string()], id, - external_id: None, + external_id: Some(external_id), meta: None, }, name, @@ -295,11 +296,6 @@ impl ScimSyncGroupBuilder { self } - pub fn set_external_id(mut self, external_id: Option) -> Self { - self.inner.entry.external_id = external_id; - self - } - pub fn build(self) -> ScimSyncGroup { self.inner } diff --git a/server/lib/src/idm/scim.rs b/server/lib/src/idm/scim.rs index f127e375a..65eb3eeb8 100644 --- a/server/lib/src/idm/scim.rs +++ b/server/lib/src/idm/scim.rs @@ -1584,10 +1584,6 @@ mod tests { assert!(matches!(sync_state, ScimSyncState::Refresh)); drop(idms_prox_read); - - // Use the current state and update. - - // TODO!!! } #[idm_test] @@ -3167,6 +3163,100 @@ mod tests { assert!(idms_prox_write.commit().is_ok()); } + #[idm_test] + /// Assert that a SCIM JSON proto entry correctly serialises and deserialises + /// and can be applied as a changeset. This serialisation is performed during + /// the ScimEntry::try_from step. + async fn test_idm_scim_sync_json_proto(idms: &IdmServer, _idms_delayed: &mut IdmServerDelayed) { + let ct = Duration::from_secs(TEST_CURRENT_TIME); + let mut idms_prox_write = idms.proxy_write(ct).await.unwrap(); + let (_sync_uuid, ident) = test_scim_sync_apply_setup_ident(&mut idms_prox_write, ct); + let sse = ScimSyncUpdateEvent { ident }; + + // Minimum Viable Person + let person_1 = ScimSyncPerson::builder( + Uuid::new_v4(), + "cn=testperson_1".to_string(), + "testperson_1".to_string(), + "Test Person One".to_string(), + ) + .build() + .try_into() + .unwrap(); + + // Minimum Viable Group + let group_1 = ScimSyncGroup::builder( + Uuid::new_v4(), + "cn=testgroup_1".to_string(), + "testgroup_1".to_string(), + ) + .build() + .try_into() + .unwrap(); + + let user_sshkey = "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBENubZikrb8hu+HeVRdZ0pp/VAk2qv4JDbuJhvD0yNdWDL2e3cBbERiDeNPkWx58Q4rVnxkbV1fa8E2waRtT91wAAAAEc3NoOg== testuser@fidokey"; + + // All Attribute Person + let person_2 = ScimSyncPerson::builder( + Uuid::new_v4(), + "cn=testperson_2".to_string(), + "testperson_2".to_string(), + "Test Person Two".to_string(), + ) + .set_password_import(Some("ipaNTHash: iEb36u6PsRetBr3YMLdYbA".to_string())) + .set_unix_password_import(Some("ipaNTHash: iEb36u6PsRetBr3YMLdYbA".to_string())) + .set_totp_import(vec![ScimTotp { + external_id: "Totp".to_string(), + secret: "QICWZTON72IBS5MXWNURKAONC3JNOOOFMLKNRTIPXBYQ4BLRSEBM7KF5".to_string(), + algo: "sha256".to_string(), + step: 60, + digits: 8, + }]) + .set_mail(vec![MultiValueAttr { + primary: Some(true), + value: "testuser@example.com".to_string(), + ..Default::default() + }]) + .set_ssh_publickey(vec![ScimSshPubKey { + label: "Key McKeyface".to_string(), + value: user_sshkey.to_string(), + }]) + .set_login_shell(Some("/bin/zsh".to_string())) + .set_account_valid_from(Some("2023-11-28T04:57:55Z".to_string())) + .set_account_expire(Some("2023-11-28T04:57:55Z".to_string())) + .set_gidnumber(Some(12346)) + .build() + .try_into() + .unwrap(); + + // All Attribute Group + let group_2 = ScimSyncGroup::builder( + Uuid::new_v4(), + "cn=testgroup_2".to_string(), + "testgroup_2".to_string(), + ) + .set_description(Some("description".to_string())) + .set_gidnumber(Some(12345)) + .set_members(vec!["cn=testperson_1".to_string(), "cn=testperson_2".to_string()].into_iter()) + .build() + .try_into() + .unwrap(); + + let entries = vec![person_1, group_1, person_2, group_2]; + + let changes = ScimSyncRequest { + from_state: ScimSyncState::Refresh, + to_state: ScimSyncState::Active { + cookie: vec![1, 2, 3, 4], + }, + entries, + retain: ScimSyncRetentionMode::Ignore, + }; + + assert!(idms_prox_write.scim_sync_apply(&sse, &changes, ct).is_ok()); + assert!(idms_prox_write.commit().is_ok()); + } + const TEST_SYNC_SCIM_IPA_1: &str = r#" { "from_state": "Refresh", diff --git a/tools/iam_migrations/freeipa/src/main.rs b/tools/iam_migrations/freeipa/src/main.rs index 24f621c45..7e682b69c 100644 --- a/tools/iam_migrations/freeipa/src/main.rs +++ b/tools/iam_migrations/freeipa/src/main.rs @@ -926,9 +926,8 @@ fn ipa_to_scim_entry( let account_valid_from = None; let login_shell = entry.remove_ava_single(Attribute::LoginShell.as_ref()); - let external_id = Some(entry.dn); - let scim_sync_person = ScimSyncPerson::builder(id, user_name, display_name) + let scim_sync_person = ScimSyncPerson::builder(id, entry.dn, user_name, display_name) .set_gidnumber(gidnumber) .set_password_import(password_import) .set_unix_password_import(unix_password_import) @@ -938,7 +937,6 @@ fn ipa_to_scim_entry( .set_ssh_publickey(ssh_publickey) .set_account_expire(account_expire) .set_account_valid_from(account_valid_from) - .set_external_id(external_id) .build(); let scim_entry_generic: ScimEntry = scim_sync_person.try_into().map_err(|json_err| { @@ -983,13 +981,10 @@ fn ipa_to_scim_entry( .map(|set| set.into_iter().collect()) .unwrap_or_default(); - let external_id = Some(entry.dn); - - let scim_sync_group = ScimSyncGroup::builder(name, id) + let scim_sync_group = ScimSyncGroup::builder(id, entry.dn, name) .set_description(description) .set_gidnumber(gidnumber) .set_members(members.into_iter()) - .set_external_id(external_id) .build(); let scim_entry_generic: ScimEntry = scim_sync_group.try_into().map_err(|json_err| { diff --git a/tools/iam_migrations/ldap/src/main.rs b/tools/iam_migrations/ldap/src/main.rs index 05e939632..8e5d52894 100644 --- a/tools/iam_migrations/ldap/src/main.rs +++ b/tools/iam_migrations/ldap/src/main.rs @@ -617,9 +617,8 @@ fn ldap_to_scim_entry( let login_shell = entry .get_ava_single(&sync_config.person_attr_login_shell) .map(str::to_string); - let external_id = Some(entry.dn); - let scim_sync_person = ScimSyncPerson::builder(id, user_name, display_name) + let scim_sync_person = ScimSyncPerson::builder(id, entry.dn, user_name, display_name) .set_gidnumber(gidnumber) .set_password_import(password_import) .set_unix_password_import(unix_password_import) @@ -629,7 +628,6 @@ fn ldap_to_scim_entry( .set_ssh_publickey(ssh_publickey) .set_account_expire(account_expire) .set_account_valid_from(account_valid_from) - .set_external_id(external_id) .build(); let scim_entry_generic: ScimEntry = scim_sync_person.try_into().map_err(|json_err| { @@ -678,13 +676,10 @@ fn ldap_to_scim_entry( .map(|set| set.into_iter().collect()) .unwrap_or_default(); - let external_id = Some(entry.dn); - - let scim_sync_group = ScimSyncGroup::builder(name, id) + let scim_sync_group = ScimSyncGroup::builder(id, entry.dn, name) .set_description(description) .set_gidnumber(gidnumber) .set_members(members.into_iter()) - .set_external_id(external_id) .build(); let scim_entry_generic: ScimEntry = scim_sync_group.try_into().map_err(|json_err| { From b6f63f3605a7260ccbce58a382226ba040896882 Mon Sep 17 00:00:00 2001 From: James Hodgkinson Date: Sat, 21 Dec 2024 15:17:12 +1000 Subject: [PATCH 30/87] kanidm-unixd example config enfixening (#3314) * kanidm-unixd default config via PPA problem with version 2 on debian bookworm Fixes #3312 * fix(coverage): moving to using cargo-tarpaulin * kanidm-unixd default config via PPA problem with version 2 on debian bookworm Fixes #3312 --- .gitignore | 6 +- Makefile | 31 +++------ book/src/developers/faq.md | 4 ++ build_rs_cov.profraw | Bin 6680 -> 0 bytes examples/kanidm-safe-default | 4 +- examples/unixd-safe-default | 16 +++-- scripts/test_coverage.sh | 64 ------------------- unix_integration/common/src/unix_config.rs | 32 ++++++++++ unix_integration/resolver/src/unix_config.rs | 35 ++++++++++ 9 files changed, 97 insertions(+), 95 deletions(-) delete mode 100644 build_rs_cov.profraw delete mode 100755 scripts/test_coverage.sh diff --git a/.gitignore b/.gitignore index 5e73cfa4e..e3f702e83 100644 --- a/.gitignore +++ b/.gitignore @@ -17,9 +17,12 @@ tools/orca/example_profiles/small/orca-edited.toml /docs/ # webui things we don't need *.d.ts - server/web_ui/*/pkg/*.js +# coverage-related things +*.profraw +tarpaulin-report.html + # kanidm simple packaging deployment-config/ kanidm_simple_pkg/ @@ -35,6 +38,7 @@ pykanidm/site/ # oauth2 integration test things scripts/oauth_proxy/client.secret scripts/oauth_proxy/envfile + # local config things .envrc diff --git a/Makefile b/Makefile index f44c275bb..bff9bbef9 100644 --- a/Makefile +++ b/Makefile @@ -314,26 +314,15 @@ cert/clean: rm -f /tmp/kanidm/ca.txt* rm -f /tmp/kanidm/ca.{cnf,srl,srl.old} -.PHONY: rust/coverage -coverage/test: ## Run coverage tests -coverage/test: - LLVM_PROFILE_FILE="$(PWD)/target/profile/coverage-%p-%m.profraw" RUSTFLAGS="-C instrument-coverage" cargo test $(TESTS) - -.PHONY: coverage/grcov -coverage/grcov: ## Run grcov -coverage/grcov: - rm -rf ./target/coverage/html - grcov . --binary-path ./target/debug/deps/ \ - -s . \ - -t html \ - --branch \ - --ignore-not-existing \ - --ignore '../*' \ - --ignore "/*" \ - --ignore "target/*" \ - -o target/coverage/html .PHONY: coverage -coverage: ## Run all the coverage tests -coverage: coverage/test coverage/grcov - echo "Coverage report is in ./target/coverage/html/index.html" +coverage: ## Run the coverage tests using cargo-tarpaulin + cargo tarpaulin --out Html + @echo "Coverage file at file://$(PWD)/tarpaulin-report.html" + + +.PHONY: coveralls +coveralls: ## Run cargo tarpaulin and upload to coveralls +coveralls: + cargo tarpaulin --coveralls $(COVERALLS_REPO_TOKEN) + @echo "Coveralls repo information is at https://coveralls.io/github/kanidm/kanidm" \ No newline at end of file diff --git a/book/src/developers/faq.md b/book/src/developers/faq.md index ea2fab6f9..6025ac335 100644 --- a/book/src/developers/faq.md +++ b/book/src/developers/faq.md @@ -114,3 +114,7 @@ When a service like sudo, sshd, su, etc. wants to authenticate someone, it opens that service, then performs authentication according to the modules defined in the pam.d config. For example, if you run `ls -al /etc/pam.d /usr/etc/pam.d` in SUSE, you can see the services and their respective pam.d config. + +## Test coverage + +We're trying to regularly get coverage reports into [Coveralls](https://coveralls.io/github/kanidm/kanidm), you can run the local testing with `make coverage` once you've installed [cargo-tarpaulin](https://crates.io/crates/cargo-tarpaulin). diff --git a/build_rs_cov.profraw b/build_rs_cov.profraw deleted file mode 100644 index 75521227e58e789879b7ce2c4f14efeddd7c4715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6680 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 TwxE@3$$65)`ge})FAwEk`4IL) diff --git a/examples/kanidm-safe-default b/examples/kanidm-safe-default index 9a06b5c14..388d8a1c7 100644 --- a/examples/kanidm-safe-default +++ b/examples/kanidm-safe-default @@ -1,7 +1,7 @@ -## Kanidm minimal Service Configuration - /etc/kanidm/config +# Kanidm minimal Service Configuration - /etc/kanidm/config # For a full example and documentation, see /usr/share/kanidm/kanidm # or `example/kanidm` in the source repository. # Replace this with your kanidmd URI and uncomment the line -#uri = "https://idm.example.com" +# uri = "https://idm.example.com" verify_ca = true diff --git a/examples/unixd-safe-default b/examples/unixd-safe-default index b231f4cd1..14d9daac3 100644 --- a/examples/unixd-safe-default +++ b/examples/unixd-safe-default @@ -1,17 +1,19 @@ -## Kanidm Unixd minimal Service Configuration - /etc/kanidm/unixd +# Kanidm Unixd minimal Service Configuration - /etc/kanidm/unixd # For a full example and documentation, see /usr/share/kanidm-unixd/unixd -# or `example/unixd` in the source repository. +# or `example/unixd` in the source repository version = '2' +[kanidm] # default_shell = "/bin/sh" - # home_attr = "uuid" # home_alias = "spn" # use_etc_skel = false - # Defines a set of POSIX groups where membership of any of these groups -# will be allowed to login via PAM. -# Replace your group below and uncomment this line: -#pam_allowed_login_groups = ["your_posix_login_group"] +# will be allowed to login via PAM +# +# WITHOUT THIS SET, NOBODY WILL BE ABLE TO LOG IN VIA PAM +# +# Replace your group below and uncomment this line +# pam_allowed_login_groups = ["your_posix_login_group"] diff --git a/scripts/test_coverage.sh b/scripts/test_coverage.sh deleted file mode 100755 index 1898ae018..000000000 --- a/scripts/test_coverage.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -set -e - -if [ "$(rustup default | grep -cE '^nightly' )" -eq 0 ]; then - echo "You need to switch to rust nightly!" - exit 1 -fi - -# if [ "$(which rustfilt | wc -l )" -eq 0 ]; then -# echo "You need to have rustfilt on the path" -# echo "cargo install rustfilt" -# exit 1 -# fi -if [ "$(which llvm-cov | wc -l )" -eq 0 ]; then - echo "You need to have llvm-cov on the path" - exit 1 -fi -export CARGO_INCREMENTAL=0 - - -export LLVM_PROFILE_FILE -echo "Profile files going into ${LLVM_PROFILE_FILE}" - -echo "Running tests" -#shellcheck disable=SC2068 - -LLVM_PROFILE_FILE="$(pwd)/target/profile/coverage-%p-%m.profraw" RUSTFLAGS="-C instrument-coverage" cargo test - -grcov . --binary-path ./target/debug/deps/ \ - -s . \ - -t html \ - --branch \ - --ignore-not-existing \ - --ignore '../*' \ - --ignore "/*" \ - -o target/coverage/html - - -# PROFDATA="./target/profile/kanidm.profdata" - -# llvm-profdata merge ./target/profile/*.profraw -o "${PROFDATA}" - -# llvm-cov report --ignore-filename-regex="\.cargo" \ -# --enable-name-compression \ -# $( \ -# for file in \ -# $( \ -# RUSTFLAGS="-C instrument-coverage" \ -# cargo test --tests --no-run --message-format=json \ -# | jq -r "select(.profile.test == true) | .filenames[]" \ -# | grep -v dSYM - \ -# ); \ -# do \ -# printf "%s %s " -object $file; \ -# done \ -# ) \ -# --instr-profile="${PROFDATA}" --summary-only - -# llvm-cov show -Xdemangler=rustfilt target/debug/kanidmd \ -# -instr-profile="${PROFDATA}" \ -# -show-line-counts-or-regions \ -# -show-instantiations \ -# -name-regex="kani.*" \ No newline at end of file diff --git a/unix_integration/common/src/unix_config.rs b/unix_integration/common/src/unix_config.rs index 931b6d735..02a9b43b1 100644 --- a/unix_integration/common/src/unix_config.rs +++ b/unix_integration/common/src/unix_config.rs @@ -141,3 +141,35 @@ impl KanidmUnixdConfig { }) } } + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use super::*; + + #[test] + fn test_load_example_configs() { + // Test the various included configs + + let examples_dir = env!("CARGO_MANIFEST_DIR").to_string() + "/../../examples/"; + + for file in PathBuf::from(&examples_dir) + .canonicalize() + .expect(&format!("Can't find examples dir at {}", examples_dir)) + .read_dir() + .expect("Can't read examples dir!") + { + let file = file.unwrap(); + let filename = file.file_name().into_string().unwrap(); + if filename.starts_with("unixd") { + print!("Checking that {} parses as a valid config...", filename); + + KanidmUnixdConfig::new() + .read_options_from_optional_config(file.path()) + .expect("Failed to parse"); + println!("OK"); + } + } + } +} diff --git a/unix_integration/resolver/src/unix_config.rs b/unix_integration/resolver/src/unix_config.rs index d25fe3338..e8a739401 100644 --- a/unix_integration/resolver/src/unix_config.rs +++ b/unix_integration/resolver/src/unix_config.rs @@ -501,3 +501,38 @@ impl UnixdConfig { }) } } + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use super::*; + + #[test] + fn test_load_example_configs() { + // Test the various included configs + + let examples_dir = env!("CARGO_MANIFEST_DIR").to_string() + "/../../examples/"; + + for file in PathBuf::from(&examples_dir) + .canonicalize() + .expect(&format!("Can't find examples dir at {}", examples_dir)) + .read_dir() + .expect("Can't read examples dir!") + { + let file = file.unwrap(); + let filename = file.file_name().into_string().unwrap(); + if filename.starts_with("unixd") { + print!("Checking that {} parses as a valid config...", filename); + + UnixdConfig::new() + .read_options_from_optional_config(file.path()) + .inspect_err(|e| { + println!("Failed to parse: {:?}", e); + }) + .expect("Failed to parse!"); + println!("OK"); + } + } + } +} From bbefb0b1b16b56a9cc638e23e85643f57e742021 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Sat, 21 Dec 2024 16:45:06 +1000 Subject: [PATCH 31/87] Update to latest webauthn-rs/time (#3315) This updates to the latest webauthn-rs release. When updating, an issue with time was found that changes the behaviour of it's parser for rfc3339. This also updates our tests to accomodate that change. Co-authored-by: James Hodgkinson --- Cargo.lock | 801 ++++++++++++++++++++-------------------- Cargo.toml | 12 +- server/lib/src/value.rs | 5 +- tools/cli/Cargo.toml | 1 + 4 files changed, 413 insertions(+), 406 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be390d35f..be6b1b7af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,9 +42,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -63,9 +63,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -192,9 +192,9 @@ dependencies = [ [[package]] name = "asn1-rs" -version = "0.3.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" dependencies = [ "asn1-rs-derive", "asn1-rs-impl", @@ -202,31 +202,31 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "asn1-rs-derive" -version = "0.1.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "synstructure 0.12.6", + "syn 2.0.90", + "synstructure", ] [[package]] name = "asn1-rs-impl" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -247,9 +247,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "flate2", "futures-core", @@ -298,21 +298,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "authenticator-ctap2-2021" -version = "0.3.2-dev.1" +name = "authenticator" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06c690e5e2800f70c0cf8773a9fe7680d66e719dae9b4cabedd13ef4885d056" +checksum = "82d71e457dc518a15eecc90d3b0660dee4b51623b34ac4262c9326e0d7e0f8e2" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "bitflags 1.3.2", "cfg-if", - "core-foundation", + "core-foundation 0.9.4", "devd-rs", "libc", "libudev", "log", "memoffset", - "nom", "openssl", "openssl-sys", "rand", @@ -344,7 +343,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "itoa", "matchit", "memchr", @@ -373,7 +372,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "itoa", "matchit", @@ -387,7 +386,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", "tower 0.5.2", "tower-layer", @@ -427,7 +426,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -495,7 +494,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -550,20 +549,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "base64urlsafedata" -version = "0.1.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18b3d30abb74120a9d5267463b9e0045fdccc4dd152e7249d966612dc1721384" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - -[[package]] -name = "base64urlsafedata" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a56894edf5cd1efa7068d7454adeb7ce0b3da4ffa5ab08cfc06165bbc62f0c7" +checksum = "72f0ad38ce7fbed55985ad5b2197f05cff8324ee6eb6638304e78f0108fae56c" dependencies = [ "base64 0.21.7", "paste", @@ -696,12 +684,12 @@ checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8" dependencies = [ "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "serde", ] @@ -719,9 +707,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -737,9 +725,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "shlex", ] @@ -821,9 +809,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.38" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" +checksum = "ac2e663e3e3bed2d32d065a8404024dad306e699a04263ec59919529f803aee9" dependencies = [ "clap", ] @@ -866,29 +854,12 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compact_jwt" -version = "0.2.10" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aa76ef19968577838a34d02848136bb9b6bdbfd7675fb968fe9c931bc434b33" -dependencies = [ - "base64 0.13.1", - "base64urlsafedata 0.1.3", - "hex", - "openssl", - "serde", - "serde_json", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "compact_jwt" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b6493b1c78b7c33fbbb00d8d60d633439fd0c0e44826fb4834efc28121ef266" +checksum = "12bbab6445446e8d0b07468a01d0bfdae15879de5c440c5e47ae4ae0e18a1fba" dependencies = [ "base64 0.21.7", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "hex", "kanidm-hsm-crypto", "openssl", @@ -919,15 +890,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "unicode-width", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -959,12 +930,13 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4934e6b7e8419148b6ef56950d277af8561060b56afd59e2aadf98b59fce6baa" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" dependencies = [ "cookie 0.18.1", - "idna 0.5.0", + "document-features", + "idna", "log", "publicsuffix", "serde", @@ -984,6 +956,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -992,9 +974,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1034,18 +1016,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1062,18 +1044,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -1224,9 +1206,9 @@ dependencies = [ [[package]] name = "der-parser" -version = "7.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ "asn1-rs", "displaydoc", @@ -1380,6 +1362,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + [[package]] name = "dunce" version = "1.0.5" @@ -1409,9 +1400,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -1470,12 +1461,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1519,7 +1510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" dependencies = [ "bit-set 0.8.0", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1535,7 +1526,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-tls", "hyper-util", "mime", @@ -1556,9 +1547,9 @@ checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fernet" @@ -1608,9 +1599,9 @@ checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1635,9 +1626,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -1866,7 +1857,7 @@ dependencies = [ "gix-validate", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1879,17 +1870,17 @@ dependencies = [ "gix-date", "gix-utils", "itoa", - "thiserror", + "thiserror 1.0.69", "winnow 0.6.20", ] [[package]] name = "gix-chunk" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28b58ba04f0c004722344390af9dbc85888fbb84be1981afb934da4114d4cf" +checksum = "c6ffbeb3a5c0b8b84c3fe4133a6f8c82fa962f4caefe8d0762eced025d3eb4f7" dependencies = [ - "thiserror", + "thiserror 2.0.8", ] [[package]] @@ -1903,7 +1894,7 @@ dependencies = [ "gix-features", "gix-hash", "memmap2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1922,22 +1913,22 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", "unicode-bom", "winnow 0.6.20", ] [[package]] name = "gix-config-value" -version = "0.14.9" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3de3fdca9c75fa4b83a76583d265fa49b1de6b088ebcd210749c24ceeb74660" +checksum = "49aaeef5d98390a3bcf9dbc6440b520b793d1bf3ed99317dc407b02be995b28e" dependencies = [ "bitflags 2.6.0", "bstr", "gix-path", "libc", - "thiserror", + "thiserror 2.0.8", ] [[package]] @@ -1948,7 +1939,7 @@ checksum = "9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0" dependencies = [ "bstr", "itoa", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -1961,7 +1952,7 @@ dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1977,7 +1968,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1995,7 +1986,7 @@ dependencies = [ "once_cell", "prodash", "sha1_smol", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -2029,7 +2020,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e" dependencies = [ "faster-hex", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2051,7 +2042,7 @@ checksum = "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2080,7 +2071,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror", + "thiserror 1.0.69", "winnow 0.6.20", ] @@ -2101,7 +2092,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2119,31 +2110,31 @@ dependencies = [ "gix-path", "memmap2", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "gix-path" -version = "0.10.12" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04e5a94fdb56b1e91eb7df2658ad16832428b8eeda24ff1a0f0288de2bce554" +checksum = "afc292ef1a51e340aeb0e720800338c805975724c1dfbd243185452efd8645b7" dependencies = [ "bstr", "gix-trace", "home", "once_cell", - "thiserror", + "thiserror 2.0.8", ] [[package]] name = "gix-quote" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89f9a1525dcfd9639e282ea939f5ab0d09d93cf2b90c1fc6104f1b9582a8e49" +checksum = "64a1e282216ec2ab2816cd57e6ed88f8009e634aec47562883c05ac8a7009a63" dependencies = [ "bstr", "gix-utils", - "thiserror", + "thiserror 2.0.8", ] [[package]] @@ -2163,7 +2154,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror", + "thiserror 1.0.69", "winnow 0.6.20", ] @@ -2178,7 +2169,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2192,7 +2183,7 @@ dependencies = [ "gix-hash", "gix-object", "gix-revwalk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2207,14 +2198,14 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "gix-sec" -version = "0.10.9" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2007538eda296445c07949cf04f4a767307d887184d6b3e83e2d636533ddc6e" +checksum = "a8b876ef997a955397809a2ec398d6a45b7a55b4918f2446344330f778d14fd6" dependencies = [ "bitflags 2.6.0", "gix-path", @@ -2255,7 +2246,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2268,7 +2259,7 @@ dependencies = [ "gix-features", "gix-path", "home", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -2289,7 +2280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf" dependencies = [ "bstr", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2310,7 +2301,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2319,9 +2310,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -2329,7 +2320,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.2.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2361,9 +2352,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -2385,12 +2376,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hex" version = "0.4.3" @@ -2399,11 +2384,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2470,9 +2455,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "httparse" @@ -2497,9 +2482,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2521,14 +2506,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.2.0", "http-body 1.0.1", "httparse", @@ -2548,7 +2533,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -2556,21 +2541,21 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "rustls 0.23.20", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tower-service", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] @@ -2579,7 +2564,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2593,7 +2578,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "native-tls", "tokio", @@ -2612,7 +2597,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.5.2", "pin-project-lite", "socket2", "tokio", @@ -2780,34 +2765,23 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "idna" -version = "0.5.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", - "smallvec", - "utf8_iter", ] [[package]] @@ -2851,12 +2825,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] @@ -2912,9 +2886,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jpeg-decoder" @@ -2924,18 +2898,19 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "jsonschema" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "893d6229c7315763ca0df9b29ab7661ee419f286577a02847c5521b462e071af" +checksum = "26a960f0c34d5423581d858ce94815cc11f0171b09939409097969ed269ede1b" dependencies = [ "ahash", "base64 0.22.1", @@ -2943,7 +2918,7 @@ dependencies = [ "email_address", "fancy-regex 0.14.0", "fraction", - "idna 1.0.2", + "idna", "itoa", "num-cmp", "once_cell", @@ -3036,9 +3011,9 @@ dependencies = [ name = "kanidm_client" version = "1.5.0-dev" dependencies = [ - "compact_jwt 0.4.2", + "compact_jwt", "http 1.2.0", - "hyper 1.5.1", + "hyper 1.5.2", "kanidm_lib_file_permissions", "kanidm_proto", "reqwest 0.12.9", @@ -3075,7 +3050,7 @@ version = "1.5.0-dev" dependencies = [ "argon2", "base64 0.22.1", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "hex", "kanidm-hsm-crypto", "kanidm_proto", @@ -3130,7 +3105,7 @@ dependencies = [ "anyhow", "clap", "clap_complete", - "compact_jwt 0.4.2", + "compact_jwt", "dialoguer", "kanidm_build_profiles", "kanidm_client", @@ -3234,12 +3209,12 @@ dependencies = [ "axum-server", "bytes", "chrono", - "compact_jwt 0.4.2", + "compact_jwt", "cron", "filetime", "futures", "futures-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "kanidm_build_profiles", "kanidm_lib_crypto", @@ -3279,9 +3254,9 @@ name = "kanidmd_lib" version = "1.5.0-dev" dependencies = [ "base64 0.22.1", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "bitflags 2.6.0", - "compact_jwt 0.4.2", + "compact_jwt", "concread", "dhat", "dyn-clone", @@ -3341,7 +3316,7 @@ name = "kanidmd_testkit" version = "1.5.0-dev" dependencies = [ "assert_cmd", - "compact_jwt 0.4.2", + "compact_jwt", "escargot", "fantoccini", "futures", @@ -3444,7 +3419,7 @@ dependencies = [ "nom", "peg", "serde", - "thiserror", + "thiserror 1.0.69", "tokio-util", "tracing", "uuid", @@ -3452,15 +3427,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -3468,9 +3443,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" @@ -3543,9 +3518,15 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" @@ -3581,7 +3562,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -3631,9 +3612,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] @@ -3671,9 +3652,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] @@ -3698,11 +3679,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -3737,7 +3717,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -3979,7 +3959,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "sha2", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -4003,9 +3983,9 @@ dependencies = [ [[package]] name = "oid-registry" -version = "0.4.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" dependencies = [ "asn1-rs", ] @@ -4098,7 +4078,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", ] @@ -4136,7 +4116,7 @@ dependencies = [ "js-sys", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.69", "urlencoding", ] @@ -4158,7 +4138,7 @@ dependencies = [ "rand", "regex", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -4316,7 +4296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", ] @@ -4421,9 +4401,9 @@ dependencies = [ [[package]] name = "predicates" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "difflib", @@ -4432,15 +4412,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -4536,11 +4516,11 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "publicsuffix" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" dependencies = [ - "idna 0.3.0", + "idna", "psl-types", ] @@ -4562,45 +4542,49 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls 0.23.20", "socket2", - "thiserror", + "thiserror 2.0.8", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls 0.23.20", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.8", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -4649,9 +4633,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -4664,7 +4648,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4695,9 +4679,9 @@ checksum = "5daffa8f5ca827e146485577fa9dba9bd9c6921e06e954ab8f6408c10f753086" [[package]] name = "referencing" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb853437e467c693ac1dc8c1520105a31b8c2588544ff2f3cfa5a7c706c6c069" +checksum = "fb8e15af8558cb157432dd3d88c1d1e982d0a5755cf80ce593b6499260aebc49" dependencies = [ "ahash", "fluent-uri", @@ -4714,7 +4698,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -4729,9 +4713,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -4764,7 +4748,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -4805,12 +4789,12 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", - "hyper-rustls 0.27.3", + "hyper 1.5.2", + "hyper-rustls 0.27.5", "hyper-util", "ipnet", "js-sys", @@ -4828,16 +4812,16 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", "windows-registry", ] @@ -4943,9 +4927,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rusticata-macros" @@ -4958,15 +4942,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.40" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4997,15 +4981,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.1.0", ] [[package]] @@ -5028,9 +5011,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -5076,9 +5062,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -5087,7 +5073,7 @@ dependencies = [ name = "scim_proto" version = "1.5.0-dev" dependencies = [ - "base64urlsafedata 0.5.0", + "base64urlsafedata", "peg", "serde", "serde_json", @@ -5129,7 +5115,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -5137,9 +5136,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -5156,14 +5155,14 @@ dependencies = [ "once_cell", "reference-counted-singleton", "selinux-sys", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "selinux-sys" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d557667087c5b4791e180b80979cd1a92fdb9bfd92cfd4b9ab199c4d7402423" +checksum = "e5e6e2b8e07a8ff45c90f8e3611bf10c4da7a28d73a26f9ede04f927da234f52" dependencies = [ "bindgen 0.70.1", "cc", @@ -5173,9 +5172,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" @@ -5270,7 +5269,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5415,9 +5414,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5452,7 +5451,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34285eaade87ba166c4f17c0ae1e35d52659507db81888beae277e962b9e5a02" dependencies = [ "base64 0.21.7", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "nom", "openssl", "serde", @@ -5541,25 +5540,13 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - [[package]] name = "synstructure" version = "0.13.1" @@ -5578,7 +5565,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -5613,9 +5600,9 @@ dependencies = [ [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "testkit-macros" @@ -5628,18 +5615,38 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +dependencies = [ + "thiserror-impl 2.0.8", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" dependencies = [ "proc-macro2", "quote", @@ -5664,9 +5671,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5687,9 +5694,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -5707,9 +5714,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -5750,7 +5757,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.0.3", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -5813,20 +5820,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls 0.23.20", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -5868,7 +5874,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow 0.5.40", ] @@ -5888,7 +5894,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-timeout", "percent-encoding", "pin-project", @@ -5930,7 +5936,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", "tokio-stream", "tower-layer", @@ -6018,7 +6024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f" dependencies = [ "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-subscriber", @@ -6135,12 +6141,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-bom" version = "2.0.3" @@ -6149,9 +6149,9 @@ checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -6170,15 +6170,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "untrusted" @@ -6188,12 +6182,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", "serde", ] @@ -6228,7 +6222,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_json", "utoipa-gen", @@ -6352,9 +6346,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -6363,13 +6357,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.90", @@ -6378,21 +6371,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6400,9 +6394,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", @@ -6413,15 +6407,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -6429,11 +6433,11 @@ dependencies = [ [[package]] name = "webauthn-attestation-ca" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b0f2ebaf5650ca15b515a761f31ed6477fa2312491cf632a71102ac22b82784" +checksum = "29e77e8859ecb93b00e4a8e56ae45f8a8dd69b1539e3d32cf4cce1db9a3a0b99" dependencies = [ - "base64urlsafedata 0.5.0", + "base64urlsafedata", "openssl", "serde", "tracing", @@ -6442,15 +6446,15 @@ dependencies = [ [[package]] name = "webauthn-authenticator-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0200dacdf1e6f9e48c6d6671de3d001b0ccd30ac21df115bcc07de2ed12bef" +checksum = "1bc2f8b61965979d9dd561dc8288a89e01ecf224179b40d5d496141225b540b4" dependencies = [ "async-stream", "async-trait", - "authenticator-ctap2-2021", + "authenticator", "base64 0.21.7", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "bitflags 1.3.2", "futures", "hex", @@ -6476,11 +6480,11 @@ dependencies = [ [[package]] name = "webauthn-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb9d7cdc9ec26e3e06f7e8ee1433e6fa3627c6c075ab3effbc3a2280c2f526c0" +checksum = "8b44347ee0d66f222043663a6aaf5ec78022b9b11c3a9ed488c21f2bd5680856" dependencies = [ - "base64urlsafedata 0.5.0", + "base64urlsafedata", "serde", "tracing", "url", @@ -6490,13 +6494,13 @@ dependencies = [ [[package]] name = "webauthn-rs-core" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1ee1dc7f4138b8fd05a74a6eae93ddaf504c5a60861f1eb95d9de3172900b3" +checksum = "2ef48f07ed8f3dfe304d6c48e85317feba0439675f31a13063b2936c9b4eaf0d" dependencies = [ "base64 0.21.7", - "base64urlsafedata 0.5.0", - "compact_jwt 0.2.10", + "base64urlsafedata", + "compact_jwt", "der-parser", "hex", "nom", @@ -6506,7 +6510,7 @@ dependencies = [ "serde", "serde_cbor_2", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", "url", "uuid", @@ -6517,12 +6521,12 @@ dependencies = [ [[package]] name = "webauthn-rs-proto" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1c6dc254607f48eec3bdb35b86b377202436859ca1e4c9290afafd7349dcc3" +checksum = "14e1367f70e7dc7b83afc971ce8a54d578f4fdf488ea093021180e073744a69f" dependencies = [ "base64 0.21.7", - "base64urlsafedata 0.5.0", + "base64urlsafedata", "serde", "serde_json", "url", @@ -6542,7 +6546,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "unicode-segmentation", "url", @@ -6556,9 +6560,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -6921,27 +6925,26 @@ dependencies = [ [[package]] name = "x509-parser" -version = "0.13.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ "asn1-rs", - "base64 0.13.1", "data-encoding", "der-parser", "lazy_static", "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -6951,14 +6954,14 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", "syn 2.0.90", - "synstructure 0.13.1", + "synstructure", ] [[package]] @@ -6984,23 +6987,23 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", "syn 2.0.90", - "synstructure 0.13.1", + "synstructure", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f3086d524..d35acac92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,7 +154,7 @@ axum = { version = "0.7.9", features = [ axum-htmx = { version = "0.5.0", features = ["serde", "guards"] } base32 = "^0.5.1" base64 = "^0.22.1" -base64urlsafedata = "0.5.0" +base64urlsafedata = "0.5.1" bitflags = "^2.6.0" bytes = "^1.9.0" clap = { version = "^4.5.23", features = ["derive", "env"] } @@ -261,7 +261,7 @@ svg = "0.13.1" syn = { version = "2.0.90", features = ["full"] } tempfile = "3.14.0" testkit-macros = { path = "./server/testkit-macros" } -time = { version = "^0.3.34", features = ["formatting", "local-offset"] } +time = { version = "^0.3.36", features = ["formatting", "local-offset"] } tokio = "^1.42.0" tokio-openssl = "^0.6.5" @@ -281,13 +281,13 @@ utoipa = { version = "4.2.0", features = ["url", "uuid"] } utoipa-swagger-ui = "6.0.0" uuid = "^1.11.0" -webauthn-authenticator-rs = { version = "0.5.0", features = [ +webauthn-authenticator-rs = { version = "0.5.1", features = [ "softpasskey", "softtoken", ] } -webauthn-rs = { version = "0.5.0", features = ["preview-features"] } -webauthn-rs-core = "0.5.0" -webauthn-rs-proto = "0.5.0" +webauthn-rs = { version = "0.5.1", features = ["preview-features"] } +webauthn-rs-core = "0.5.1" +webauthn-rs-proto = "0.5.1" whoami = "^1.5.2" walkdir = "2" diff --git a/server/lib/src/value.rs b/server/lib/src/value.rs index 3bde2cdd7..08f6148de 100644 --- a/server/lib/src/value.rs +++ b/server/lib/src/value.rs @@ -2409,10 +2409,13 @@ mod tests { assert!(val1.validate()); let val2 = Value::new_datetime_s("2020-09-25T01:22:02+00:00").expect("Must be valid"); assert!(val2.validate()); + // Spaces are now valid in rfc3339 for parsing. + let val3 = Value::new_datetime_s("2020-09-25 01:22:02+00:00").expect("Must be valid"); + assert!(val3.validate()); + assert!(Value::new_datetime_s("2020-09-25T01:22:02").is_none()); assert!(Value::new_datetime_s("2020-09-25").is_none()); assert!(Value::new_datetime_s("2020-09-25T01:22:02+10").is_none()); - assert!(Value::new_datetime_s("2020-09-25 01:22:02+00:00").is_none()); // Manually craft let inv1 = Value::DateTime( diff --git a/tools/cli/Cargo.toml b/tools/cli/Cargo.toml index 58a0b5128..e0acdd794 100644 --- a/tools/cli/Cargo.toml +++ b/tools/cli/Cargo.toml @@ -87,6 +87,7 @@ features = ["u2fhid"] [target."cfg(target_os = \"macos\")".dependencies.webauthn-authenticator-rs] workspace = true features = ["mozilla"] +# features = ["u2fhid"] [target."cfg(target_os = \"freebsd\")".dependencies.webauthn-authenticator-rs] workspace = true From c4441c1fca4f5a98db5827b4f1fd9a1ddfbaf256 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Sat, 21 Dec 2024 17:08:39 +1000 Subject: [PATCH 32/87] nss/pam resolver should reauth faster (#3309) This can have visible impacts on accounts that don't have a pam password cached yet, but then appear to "stall" for a minute or two until it works due to the fact that the provider was offline and waiting to reauth. When we are still connected but our provider auth session has expired we should reconnect faster. This reduces the timeout for reauthentication for the provider so that it can return to the online state sooner. We also loop when we detect the provider session is no longer authenticated so that we can reauth immediately, rather than causing a noticable interuption. --- .../resolver/src/idprovider/kanidm.rs | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/unix_integration/resolver/src/idprovider/kanidm.rs b/unix_integration/resolver/src/idprovider/kanidm.rs index b72fd289b..d0a6a8159 100644 --- a/unix_integration/resolver/src/idprovider/kanidm.rs +++ b/unix_integration/resolver/src/idprovider/kanidm.rs @@ -23,6 +23,7 @@ use kanidm_unix_common::unix_proto::PamAuthRequest; const KANIDM_HMAC_KEY: &str = "kanidm-hmac-key"; const KANIDM_PWV1_KEY: &str = "kanidm-pw-v1"; +// If the provider is offline, we need to backoff and wait a bit. const OFFLINE_NEXT_CHECK: Duration = Duration::from_secs(60); #[derive(Debug, Clone)] @@ -243,6 +244,7 @@ impl UserToken { } impl KanidmProviderInternal { + #[instrument(level = "debug", skip_all)] async fn check_online(&mut self, tpm: &mut tpm::BoxedDynTpm, now: SystemTime) -> bool { match self.state { // Proceed @@ -255,23 +257,35 @@ impl KanidmProviderInternal { } } + #[instrument(level = "debug", skip_all)] async fn attempt_online(&mut self, _tpm: &mut tpm::BoxedDynTpm, now: SystemTime) -> bool { - match self.client.auth_anonymous().await { - Ok(_uat) => { - self.state = CacheState::Online; - true - } - Err(ClientError::Transport(err)) => { - warn!(?err, "transport failure"); - self.state = CacheState::OfflineNextCheck(now + OFFLINE_NEXT_CHECK); - false - } - Err(err) => { - error!(?err, "Provider authentication failed"); - self.state = CacheState::OfflineNextCheck(now + OFFLINE_NEXT_CHECK); - false + let mut max_attempts = 3; + while max_attempts > 0 { + max_attempts -= 1; + match self.client.auth_anonymous().await { + Ok(_uat) => { + debug!("provider is now online"); + self.state = CacheState::Online; + return true; + } + Err(ClientError::Http(StatusCode::UNAUTHORIZED, reason, opid)) => { + error!(?reason, ?opid, "Provider authentication returned unauthorized, {max_attempts} attempts remaining."); + // Provider needs to re-auth ASAP. We set this state value here + // so that if we exceed max attempts, the next caller knows to check + // online immediately. + self.state = CacheState::OfflineNextCheck(now); + // attempt again immediately!!!! + continue; + } + Err(err) => { + error!(?err, "Provider online failed"); + self.state = CacheState::OfflineNextCheck(now + OFFLINE_NEXT_CHECK); + return false; + } } } + warn!("Exceeded maximum number of attempts to bring provider online"); + return false; } } @@ -351,7 +365,8 @@ impl IdProvider for KanidmProvider { e, opid ), }; - inner.state = CacheState::OfflineNextCheck(now + OFFLINE_NEXT_CHECK); + // Provider needs to re-auth ASAP + inner.state = CacheState::OfflineNextCheck(now); Ok(UserTokenState::UseCached) } // 404 / Removed. From 4113c291ed8e2993364a18d49dfa95998190eddc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 10:02:30 +1000 Subject: [PATCH 33/87] Bump the all group in /pykanidm with 7 updates (#3316) --- updated-dependencies: - dependency-name: pydantic dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: aiohttp dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: authlib dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: pook dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pykanidm/poetry.lock | 494 ++++++++++++++++++++-------------------- pykanidm/pyproject.toml | 8 +- 2 files changed, 251 insertions(+), 251 deletions(-) diff --git a/pykanidm/poetry.lock b/pykanidm/poetry.lock index 6f8caf724..2842fc808 100644 --- a/pykanidm/poetry.lock +++ b/pykanidm/poetry.lock @@ -13,87 +13,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.10" +version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, - {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, - {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, - {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, - {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, - {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, - {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, - {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, - {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, - {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, - {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, - {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, ] [package.dependencies] @@ -180,13 +180,13 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "authlib" -version = "1.3.2" +version = "1.4.0" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "Authlib-1.3.2-py2.py3-none-any.whl", hash = "sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc"}, - {file = "authlib-1.3.2.tar.gz", hash = "sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2"}, + {file = "Authlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bb20b978c8b636222b549317c1815e1fe62234fc1c5efe8855d84aebf3a74e3"}, + {file = "authlib-1.4.0.tar.gz", hash = "sha256:1c1e6608b5ed3624aeeee136ca7f8c120d6f51f731aa152b153d54741840e1f2"}, ] [package.dependencies] @@ -1032,13 +1032,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.48" +version = "9.5.49" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.48-py3-none-any.whl", hash = "sha256:b695c998f4b939ce748adbc0d3bff73fa886a670ece948cf27818fa115dc16f8"}, - {file = "mkdocs_material-9.5.48.tar.gz", hash = "sha256:a582531e8b34f4c7ed38c29d5c44763053832cf2a32f7409567e0c74749a47db"}, + {file = "mkdocs_material-9.5.49-py3-none-any.whl", hash = "sha256:c3c2d8176b18198435d3a3e119011922f3e11424074645c24019c2dcf08a360e"}, + {file = "mkdocs_material-9.5.49.tar.gz", hash = "sha256:3671bb282b4f53a1c72e08adbe04d2481a98f85fed392530051f80ff94a9621d"}, ] [package.dependencies] @@ -1215,49 +1215,49 @@ files = [ [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87"}, + {file = "mypy-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179"}, + {file = "mypy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e"}, + {file = "mypy-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3"}, + {file = "mypy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44"}, + {file = "mypy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a"}, + {file = "mypy-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc"}, + {file = "mypy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015"}, + {file = "mypy-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb"}, + {file = "mypy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc"}, + {file = "mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd"}, + {file = "mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1"}, + {file = "mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63"}, + {file = "mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d"}, + {file = "mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba"}, + {file = "mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741"}, + {file = "mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7"}, + {file = "mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8"}, + {file = "mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc"}, + {file = "mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f"}, + {file = "mypy-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b16738b1d80ec4334654e89e798eb705ac0c36c8a5c4798496cd3623aa02286"}, + {file = "mypy-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10065fcebb7c66df04b05fc799a854b1ae24d9963c8bb27e9064a9bdb43aa8ad"}, + {file = "mypy-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fbb7d683fa6bdecaa106e8368aa973ecc0ddb79a9eaeb4b821591ecd07e9e03c"}, + {file = "mypy-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3498cb55448dc5533e438cd13d6ddd28654559c8c4d1fd4b5ca57a31b81bac01"}, + {file = "mypy-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:c7b243408ea43755f3a21a0a08e5c5ae30eddb4c58a80f415ca6b118816e60aa"}, + {file = "mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e"}, + {file = "mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc"}, + {file = "mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b"}, + {file = "mypy-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7"}, + {file = "mypy-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f"}, + {file = "mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab"}, + {file = "mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -1361,13 +1361,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pook" -version = "2.1.2" +version = "2.1.3" description = "HTTP traffic mocking and expectations made easy" optional = false python-versions = ">=3.9" files = [ - {file = "pook-2.1.2-py3-none-any.whl", hash = "sha256:ea76784ee1440ee8dde08047c6a1f68be46a07d07a5180d068a047db5620ca1d"}, - {file = "pook-2.1.2.tar.gz", hash = "sha256:4acbb9d13ac18b807fd3a54b414a22a16b75db6e5048bc88461479da03c4ecbf"}, + {file = "pook-2.1.3-py3-none-any.whl", hash = "sha256:f8e75e2e41b1f6da37d0bc6b77a0f4da33c4d4de382105046efd644fe5ca2f8e"}, + {file = "pook-2.1.3.tar.gz", hash = "sha256:441191c0f3d014b141ca71430a0c2bfa6d2369ac24703a3fdfbbf5a25146d8c0"}, ] [package.dependencies] @@ -1495,18 +1495,18 @@ files = [ [[package]] name = "pydantic" -version = "2.10.3" +version = "2.10.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, - {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, + {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, + {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.1" +pydantic-core = "2.27.2" typing-extensions = ">=4.12.2" [package.extras] @@ -1515,111 +1515,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.27.1" +version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, - {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, - {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, - {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, - {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, - {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, - {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, - {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, - {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, - {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, - {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, - {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, - {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, - {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, - {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, - {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, - {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] [package.dependencies] @@ -2135,29 +2135,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.3" +version = "0.8.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, - {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, - {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, - {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, - {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, - {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, - {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, + {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, + {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, + {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, + {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, + {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, + {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, + {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, + {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, + {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, ] [[package]] @@ -2414,4 +2414,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "6396dc4ab6d72485a70114af26bcae24c090e264f555cf809ea1c51ac0194212" +content-hash = "fe1fb1e0400f6d064e1a42699afb2d06cff6f48f13efff68769ba75595bcd7c1" diff --git a/pykanidm/pyproject.toml b/pykanidm/pyproject.toml index 97c2c0db3..1521f0e9c 100644 --- a/pykanidm/pyproject.toml +++ b/pykanidm/pyproject.toml @@ -28,7 +28,7 @@ aiohttp = "^3.8.1" Authlib = "^1.2.0" [tool.poetry.dev-dependencies] -mypy = "^1.13" +mypy = "^1.14" pytest = "^8.3.4" types-toml = "^0.10.8" pylint-pydantic = "^0.3.4" @@ -39,13 +39,13 @@ pytest-mock = "^3.14.0" pytest-aiohttp = "^1.0.5" black = "^24.10.0" mkdocs = "^1.5.3" -mkdocs-material = "^9.5.48" +mkdocs-material = "^9.5.49" mkdocstrings = "^0.27.0" mkdocstrings-python = "^1.12.2" -pook = "^2.1.2" +pook = "^2.1.3" [tool.poetry.group.dev.dependencies] -ruff = ">=0.5.1,<0.8.4" +ruff = ">=0.5.1,<0.8.5" [build-system] requires = ["poetry-core>=1.0.0"] From 009200375f8a2d564164afb0b266819e32b5945a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 00:29:06 +0000 Subject: [PATCH 34/87] Bump the all group with 3 updates (#3317) Bumps the all group with 3 updates: [anyhow](https://github.com/dtolnay/anyhow), [serde_json](https://github.com/serde-rs/json) and [syn](https://github.com/dtolnay/syn). Updates `anyhow` from 1.0.94 to 1.0.95 - [Release notes](https://github.com/dtolnay/anyhow/releases) - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.94...1.0.95) Updates `serde_json` from 1.0.133 to 1.0.134 - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.133...v1.0.134) Updates `syn` from 2.0.90 to 2.0.91 - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.90...2.0.91) --- updated-dependencies: - dependency-name: anyhow dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 94 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 6 ++-- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be6b1b7af..808305d05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arc-swap" @@ -172,7 +172,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -214,7 +214,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure", ] @@ -226,7 +226,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -277,7 +277,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -288,7 +288,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -480,7 +480,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -586,7 +586,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.91", "which", ] @@ -607,7 +607,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -825,7 +825,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1160,7 +1160,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1182,7 +1182,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1226,7 +1226,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1353,7 +1353,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1430,7 +1430,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1450,7 +1450,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1739,7 +1739,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2053,7 +2053,7 @@ checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2743,7 +2743,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3308,7 +3308,7 @@ version = "1.5.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4019,7 +4019,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4353,7 +4353,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4433,7 +4433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4668,7 +4668,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4899,7 +4899,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.90", + "syn 2.0.91", "walkdir", ] @@ -5222,14 +5222,14 @@ checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -5286,7 +5286,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5523,9 +5523,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -5555,7 +5555,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5610,7 +5610,7 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5639,7 +5639,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5650,7 +5650,7 @@ checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5745,7 +5745,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5784,7 +5784,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6004,7 +6004,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6238,7 +6238,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.90", + "syn 2.0.91", "url", "uuid", ] @@ -6365,7 +6365,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-shared", ] @@ -6400,7 +6400,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6960,7 +6960,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure", ] @@ -6982,7 +6982,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7002,7 +7002,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure", ] @@ -7023,7 +7023,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -7045,7 +7045,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d35acac92..fdb93c679 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -136,7 +136,7 @@ kanidm_utils_users = { path = "./libs/users", version = "=1.5.0-dev" } scim_proto = { path = "./libs/scim_proto", version = "=1.5.0-dev" } sketching = { path = "./libs/sketching", version = "=1.5.0-dev" } -anyhow = { version = "1.0.94" } +anyhow = { version = "1.0.95" } argon2 = { version = "0.5.3", features = ["alloc"] } askama = { version = "0.12.1", features = ["serde", "with-axum"] } askama_axum = { version = "0.4.0" } @@ -247,7 +247,7 @@ sd-notify = "^0.4.3" selinux = "^0.4.6" serde = "^1.0.216" serde_cbor = { version = "0.12.0-dev", package = "serde_cbor_2" } -serde_json = "^1.0.133" +serde_json = "^1.0.134" serde_urlencoded = "^0.7.1" serde_with = "3.11.0" sha-crypt = "0.5.0" @@ -258,7 +258,7 @@ smolset = "^1.3.1" sshkey-attest = "^0.5.0" sshkeys = "0.3.3" svg = "0.13.1" -syn = { version = "2.0.90", features = ["full"] } +syn = { version = "2.0.91", features = ["full"] } tempfile = "3.14.0" testkit-macros = { path = "./server/testkit-macros" } time = { version = "^0.3.36", features = ["formatting", "local-offset"] } From c0e733629fe60c5c7cd7ada6261bbc87664ea584 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:18:58 +1000 Subject: [PATCH 35/87] Bump the all group in /pykanidm with 2 updates (#3323) Bumps the all group in /pykanidm with 2 updates: [coverage](https://github.com/nedbat/coveragepy) and [mkdocstrings-python](https://github.com/mkdocstrings/python). Updates `coverage` from 7.6.9 to 7.6.10 - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.6.9...7.6.10) Updates `mkdocstrings-python` from 1.12.2 to 1.13.0 - [Release notes](https://github.com/mkdocstrings/python/releases) - [Changelog](https://github.com/mkdocstrings/python/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/python/compare/1.12.2...1.13.0) --- updated-dependencies: - dependency-name: coverage dependency-type: direct:development update-type: version-update:semver-patch dependency-group: all - dependency-name: mkdocstrings-python dependency-type: direct:development update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pykanidm/poetry.lock | 134 ++++++++++++++++++++-------------------- pykanidm/pyproject.toml | 4 +- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/pykanidm/poetry.lock b/pykanidm/poetry.lock index 2842fc808..258986adb 100644 --- a/pykanidm/poetry.lock +++ b/pykanidm/poetry.lock @@ -468,73 +468,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.9" +version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, - {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, - {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, - {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, - {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, - {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, - {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, - {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, - {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, - {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, - {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, - {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, - {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, - {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, - {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, - {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, ] [package.extras] @@ -1100,13 +1100,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.12.2" +version = "1.13.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a"}, - {file = "mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3"}, + {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, + {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, ] [package.dependencies] @@ -2414,4 +2414,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "fe1fb1e0400f6d064e1a42699afb2d06cff6f48f13efff68769ba75595bcd7c1" +content-hash = "d525ac7a72aa56c51f293501602fccf7c93ba97a249cc714eb4e06e72f5b7f58" diff --git a/pykanidm/pyproject.toml b/pykanidm/pyproject.toml index 1521f0e9c..f8fb32495 100644 --- a/pykanidm/pyproject.toml +++ b/pykanidm/pyproject.toml @@ -32,7 +32,7 @@ mypy = "^1.14" pytest = "^8.3.4" types-toml = "^0.10.8" pylint-pydantic = "^0.3.4" -coverage = "^7.6.9" +coverage = "^7.6.10" pylint-pytest = "^1.1.7" pytest-asyncio = "^0.25.0" pytest-mock = "^3.14.0" @@ -41,7 +41,7 @@ black = "^24.10.0" mkdocs = "^1.5.3" mkdocs-material = "^9.5.49" mkdocstrings = "^0.27.0" -mkdocstrings-python = "^1.12.2" +mkdocstrings-python = "^1.13.0" pook = "^2.1.3" [tool.poetry.group.dev.dependencies] From 227853f8cd01e184aac8efc82dd027b4d6e772e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Dec 2024 22:46:26 +0000 Subject: [PATCH 36/87] Bump the all group with 6 updates (#3324) Bumps the all group with 6 updates: | Package | From | To | | --- | --- | --- | | [quote](https://github.com/dtolnay/quote) | `1.0.37` | `1.0.38` | | [reqwest](https://github.com/seanmonstar/reqwest) | `0.12.9` | `0.12.11` | | [serde](https://github.com/serde-rs/serde) | `1.0.216` | `1.0.217` | | [serde_with](https://github.com/jonasbb/serde_with) | `3.11.0` | `3.12.0` | | [syn](https://github.com/dtolnay/syn) | `2.0.91` | `2.0.93` | | [jsonschema](https://github.com/Stranger6667/jsonschema) | `0.26.2` | `0.28.0` | Updates `quote` from 1.0.37 to 1.0.38 - [Release notes](https://github.com/dtolnay/quote/releases) - [Commits](https://github.com/dtolnay/quote/compare/1.0.37...1.0.38) Updates `reqwest` from 0.12.9 to 0.12.11 - [Release notes](https://github.com/seanmonstar/reqwest/releases) - [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md) - [Commits](https://github.com/seanmonstar/reqwest/compare/v0.12.9...v0.12.11) Updates `serde` from 1.0.216 to 1.0.217 - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.216...v1.0.217) Updates `serde_with` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/jonasbb/serde_with/releases) - [Commits](https://github.com/jonasbb/serde_with/compare/v3.11.0...v3.12.0) Updates `syn` from 2.0.91 to 2.0.93 - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.91...2.0.93) Updates `jsonschema` from 0.26.2 to 0.28.0 - [Release notes](https://github.com/Stranger6667/jsonschema/releases) - [Changelog](https://github.com/Stranger6667/jsonschema/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stranger6667/jsonschema/compare/rust-v0.26.2...rust-v0.28.0) --- updated-dependencies: - dependency-name: quote dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: reqwest dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: serde_with dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: jsonschema dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 129 ++++++++++++++++++----------------- Cargo.toml | 8 +-- server/testkit/Cargo.toml | 2 +- tools/device_flow/Cargo.toml | 2 +- 4 files changed, 71 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 808305d05..248ba49df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,7 +172,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -214,7 +214,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "synstructure", ] @@ -226,7 +226,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -277,7 +277,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -288,7 +288,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -480,7 +480,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -586,7 +586,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.91", + "syn 2.0.93", "which", ] @@ -607,7 +607,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -825,7 +825,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1104,7 +1104,7 @@ dependencies = [ "kanidmd_core", "mimalloc", "prctl", - "reqwest 0.12.9", + "reqwest 0.12.11", "sd-notify", "serde", "serde_json", @@ -1160,7 +1160,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1182,7 +1182,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1226,7 +1226,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1353,7 +1353,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1430,7 +1430,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1450,7 +1450,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1739,7 +1739,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2053,7 +2053,7 @@ checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2743,7 +2743,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2908,9 +2908,9 @@ dependencies = [ [[package]] name = "jsonschema" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a960f0c34d5423581d858ce94815cc11f0171b09939409097969ed269ede1b" +checksum = "74d8eb539cdb4222da29bb658cc9881aa2477b33fb1a74c5c31450395fc1a4b2" dependencies = [ "ahash", "base64 0.22.1", @@ -2925,7 +2925,7 @@ dependencies = [ "percent-encoding", "referencing", "regex-syntax 0.8.5", - "reqwest 0.12.9", + "reqwest 0.12.11", "serde", "serde_json", "uuid-simd", @@ -3016,7 +3016,7 @@ dependencies = [ "hyper 1.5.2", "kanidm_lib_file_permissions", "kanidm_proto", - "reqwest 0.12.9", + "reqwest 0.12.11", "serde", "serde_json", "serde_urlencoded", @@ -3037,7 +3037,7 @@ dependencies = [ "base64 0.22.1", "kanidm_proto", "oauth2", - "reqwest 0.12.9", + "reqwest 0.12.11", "sketching", "tokio", "tracing", @@ -3308,7 +3308,7 @@ version = "1.5.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -3331,7 +3331,7 @@ dependencies = [ "oauth2", "openssl", "petgraph", - "reqwest 0.12.9", + "reqwest 0.12.11", "serde", "serde_json", "sketching", @@ -4019,7 +4019,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4353,7 +4353,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4433,7 +4433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4594,9 +4594,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -4668,7 +4668,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4679,9 +4679,9 @@ checksum = "5daffa8f5ca827e146485577fa9dba9bd9c6921e06e954ab8f6408c10f753086" [[package]] name = "referencing" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8e15af8558cb157432dd3d88c1d1e982d0a5755cf80ce593b6499260aebc49" +checksum = "093a875008827c0ae15c746189966e162faa05bf347719d06302c548ac63630f" dependencies = [ "ahash", "fluent-uri", @@ -4777,9 +4777,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3" dependencies = [ "async-compression", "base64 0.22.1", @@ -4816,6 +4816,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.1", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", @@ -4899,7 +4900,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.91", + "syn 2.0.93", "walkdir", ] @@ -5178,9 +5179,9 @@ checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -5216,13 +5217,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5261,9 +5262,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", @@ -5279,14 +5280,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5523,9 +5524,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", @@ -5555,7 +5556,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5610,7 +5611,7 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5639,7 +5640,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5650,7 +5651,7 @@ checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5745,7 +5746,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5784,7 +5785,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6004,7 +6005,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6238,7 +6239,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.91", + "syn 2.0.93", "url", "uuid", ] @@ -6365,7 +6366,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "wasm-bindgen-shared", ] @@ -6400,7 +6401,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6960,7 +6961,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "synstructure", ] @@ -6982,7 +6983,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -7002,7 +7003,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "synstructure", ] @@ -7023,7 +7024,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -7045,7 +7046,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index fdb93c679..1de526897 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -231,7 +231,7 @@ quote = "1" rand = "^0.8.5" rand_chacha = "0.3.1" regex = "1.11.0" -reqwest = { version = "0.12.9", default-features = false, features = [ +reqwest = { version = "0.12.11", default-features = false, features = [ "cookies", "http2", "json", @@ -245,11 +245,11 @@ rustls = { version = "0.23.20", default-features = false, features = [ sd-notify = "^0.4.3" selinux = "^0.4.6" -serde = "^1.0.216" +serde = "^1.0.217" serde_cbor = { version = "0.12.0-dev", package = "serde_cbor_2" } serde_json = "^1.0.134" serde_urlencoded = "^0.7.1" -serde_with = "3.11.0" +serde_with = "3.12.0" sha-crypt = "0.5.0" sha2 = "0.10.8" shellexpand = "^2.1.2" @@ -258,7 +258,7 @@ smolset = "^1.3.1" sshkey-attest = "^0.5.0" sshkeys = "0.3.3" svg = "0.13.1" -syn = { version = "2.0.91", features = ["full"] } +syn = { version = "2.0.93", features = ["full"] } tempfile = "3.14.0" testkit-macros = { path = "./server/testkit-macros" } time = { version = "^0.3.36", features = ["formatting", "local-offset"] } diff --git a/server/testkit/Cargo.toml b/server/testkit/Cargo.toml index 7dae25abc..7d4f0f78a 100644 --- a/server/testkit/Cargo.toml +++ b/server/testkit/Cargo.toml @@ -66,4 +66,4 @@ tokio-openssl = { workspace = true } kanidm_lib_crypto = { workspace = true } uuid = { workspace = true } webauthn-authenticator-rs = { workspace = true } -jsonschema = "0.26.1" +jsonschema = "0.28.0" diff --git a/tools/device_flow/Cargo.toml b/tools/device_flow/Cargo.toml index 6f4679488..373c99241 100644 --- a/tools/device_flow/Cargo.toml +++ b/tools/device_flow/Cargo.toml @@ -21,7 +21,7 @@ doctest = false kanidm_proto = { workspace = true } anyhow = { workspace = true } oauth2 = "4.4.2" -reqwest = { version = "0.12.9", default-features = false, features = [ +reqwest = { version = "0.12.11", default-features = false, features = [ "rustls-tls", ] } From 5eb9a4430f4beab41aed7d5d77414ceea6b2eb1c Mon Sep 17 00:00:00 2001 From: Jinna Kiisuo Date: Wed, 1 Jan 2025 00:40:14 +0200 Subject: [PATCH 37/87] fix: PAM on Debian, enable use_first_pass by default (#3326) Since we use Debian's PAM autoconf, pam_unix isn't disabled and remains active. This means pam_unix triggers first and pam_kanidm should use the password it already tried to match to a local user. This change also moves the postinst hook for PAM config correctly to the libpam-kanidm package, since that's the one that delivers the config that needs a reinstall! --- unix_integration/pam_kanidm/Cargo.toml | 1 + unix_integration/pam_kanidm/debian/kanidm.pam | 2 +- unix_integration/pam_kanidm/debian/postinst | 29 +++++++++++++++++++ unix_integration/resolver/debian/postinst | 3 +- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 unix_integration/pam_kanidm/debian/postinst diff --git a/unix_integration/pam_kanidm/Cargo.toml b/unix_integration/pam_kanidm/Cargo.toml index 984a6b703..56f6ae3c9 100644 --- a/unix_integration/pam_kanidm/Cargo.toml +++ b/unix_integration/pam_kanidm/Cargo.toml @@ -35,6 +35,7 @@ maintainer = "James Hodgkinson " depends = ["libc6", "libpam0g"] section = "network" priority = "optional" +maintainer-scripts = "debian/" assets = [ # Empty on purpose ] diff --git a/unix_integration/pam_kanidm/debian/kanidm.pam b/unix_integration/pam_kanidm/debian/kanidm.pam index 17da012b3..f2e5f4dc1 100644 --- a/unix_integration/pam_kanidm/debian/kanidm.pam +++ b/unix_integration/pam_kanidm/debian/kanidm.pam @@ -4,7 +4,7 @@ Priority: 128 Auth-Type: Primary Auth: - [success=end new_authtok_reqd=done default=ignore] pam_kanidm.so ignore_unknown_user + [success=end new_authtok_reqd=done default=ignore] pam_kanidm.so ignore_unknown_user use_first_pass Account-Type: Primary Account: diff --git a/unix_integration/pam_kanidm/debian/postinst b/unix_integration/pam_kanidm/debian/postinst new file mode 100644 index 000000000..ecd061d5a --- /dev/null +++ b/unix_integration/pam_kanidm/debian/postinst @@ -0,0 +1,29 @@ +#!/bin/sh +# postinst script for libpam-kanidm +# +# see: dh_installdeb(1) + +set -e + + +case "$1" in + configure) + echo "Updating PAM configuration" + pam-auth-update --package + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/unix_integration/resolver/debian/postinst b/unix_integration/resolver/debian/postinst index cc7c10be6..d5d5b9562 100644 --- a/unix_integration/resolver/debian/postinst +++ b/unix_integration/resolver/debian/postinst @@ -8,13 +8,12 @@ set -e case "$1" in configure) - pam-auth-update --package echo "=============================" echo "Thanks for installing Kanidm!" echo "=============================" echo "Please ensure you modify the configuration files at /etc/kanidm/unixd and /etc/kanidm/config" echo "Full examples are in /usr/share/kanidm-unixd/" - echo "To configure nsswitch, please follow instructions in https://kanidm.github.io/kanidm/master/integrations/pam_and_nsswitch.html" + echo "PAM has already been autoconfigured by the libpam-kanidm package. To configure nsswitch, please follow instructions in https://kanidm.github.io/kanidm/master/integrations/pam_and_nsswitch.html" ;; abort-upgrade|abort-remove|abort-deconfigure) From 226274da23b7ddcfa6aaf037a3a570930f967a70 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Sat, 4 Jan 2025 09:22:44 +1000 Subject: [PATCH 38/87] 20250102 freebsd client (#3333) Support freebsd as a unix client --- Cargo.lock | 5 +- libs/profiles/container_generic.toml | 9 +- libs/profiles/developer.toml | 9 +- libs/profiles/release_freebsd.toml | 7 + libs/profiles/release_linux.toml | 9 +- libs/profiles/src/lib.rs | 29 +- platform/freebsd/README.md | 4 + platform/freebsd/client/Makefile | 49 + platform/freebsd/client/Makefile.crates | 624 ++++++++ platform/freebsd/client/distinfo | 1251 +++++++++++++++++ platform/freebsd/client/files/kanidm_unixd.in | 27 + .../client/files/kanidm_unixd_tasks.in | 27 + platform/freebsd/client/pkg-descr | 1 + platform/freebsd/client/pkg-plist | 13 + server/core/src/config.rs | 2 +- server/core/src/https/mod.rs | 6 +- server/daemon/src/main.rs | 6 +- unix_integration/common/src/constants.rs | 4 +- unix_integration/nss_kanidm/Cargo.toml | 3 + unix_integration/nss_kanidm/build.rs | 12 + unix_integration/nss_kanidm/src/freebsd_nss.c | 94 ++ unix_integration/nss_kanidm/src/lib.rs | 26 + 22 files changed, 2182 insertions(+), 35 deletions(-) create mode 100644 libs/profiles/release_freebsd.toml create mode 100644 platform/freebsd/README.md create mode 100644 platform/freebsd/client/Makefile create mode 100644 platform/freebsd/client/Makefile.crates create mode 100644 platform/freebsd/client/distinfo create mode 100644 platform/freebsd/client/files/kanidm_unixd.in create mode 100644 platform/freebsd/client/files/kanidm_unixd_tasks.in create mode 100644 platform/freebsd/client/pkg-descr create mode 100644 platform/freebsd/client/pkg-plist create mode 100644 unix_integration/nss_kanidm/build.rs create mode 100644 unix_integration/nss_kanidm/src/freebsd_nss.c diff --git a/Cargo.lock b/Cargo.lock index 248ba49df..0f2523002 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -725,9 +725,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" dependencies = [ "shlex", ] @@ -3789,6 +3789,7 @@ dependencies = [ name = "nss_kanidm" version = "1.5.0-dev" dependencies = [ + "cc", "kanidm_unix_common", "lazy_static", "libc", diff --git a/libs/profiles/container_generic.toml b/libs/profiles/container_generic.toml index b4049d809..614d93bff 100644 --- a/libs/profiles/container_generic.toml +++ b/libs/profiles/container_generic.toml @@ -1,6 +1,7 @@ -htmx_ui_pkg_path = "/hpkg" # Don't set the cpu_flags to autodetect for this platform # cpu_flags = "none" -admin_bind_path = "/data/kanidmd.sock" -default_config_path = "/data/server.toml" -default_unix_shell_path = "/bin/false" +server_admin_bind_path = "/data/kanidmd.sock" +server_ui_pkg_path = "/hpkg" +server_config_path = "/data/server.toml" +resolver_config_path = "/data/unixd" +resolver_unix_shell_path = "/bin/false" diff --git a/libs/profiles/developer.toml b/libs/profiles/developer.toml index bb0c79d55..42539e20f 100644 --- a/libs/profiles/developer.toml +++ b/libs/profiles/developer.toml @@ -1,6 +1,7 @@ -htmx_ui_pkg_path = "../core/static" # Set to native for developer machines. cpu_flags = "native" -admin_bind_path = "/tmp/kanidmd.sock" -default_config_path = "../../examples/insecure_server.toml" -default_unix_shell_path = "/bin/bash" +server_admin_bind_path = "/tmp/kanidmd.sock" +server_ui_pkg_path = "../core/static" +server_config_path = "../../examples/insecure_server.toml" +resolver_config_path = "/tmp/unixd" +resolver_unix_shell_path = "/bin/bash" diff --git a/libs/profiles/release_freebsd.toml b/libs/profiles/release_freebsd.toml new file mode 100644 index 000000000..305da3d1c --- /dev/null +++ b/libs/profiles/release_freebsd.toml @@ -0,0 +1,7 @@ +# Don't set the value for autodetect +# cpu_flags = "none" +server_admin_bind_path = "/var/run/kanidmd/sock" +server_ui_pkg_path = "/usr/local/share/kanidm/ui/hpkg" +server_config_path = "/usr/local/etc/kanidm/server.toml" +resolver_config_path = "/usr/local/etc/kanidm/unixd" +resolver_unix_shell_path = "/bin/sh" diff --git a/libs/profiles/release_linux.toml b/libs/profiles/release_linux.toml index 2b8239181..1b12a2309 100644 --- a/libs/profiles/release_linux.toml +++ b/libs/profiles/release_linux.toml @@ -1,6 +1,7 @@ -htmx_ui_pkg_path = "/usr/share/kanidm/ui/hpkg" # Don't set the value for autodetect # cpu_flags = "none" -admin_bind_path = "/var/run/kanidmd/sock" -default_config_path = "/etc/kanidm/server.toml" -default_unix_shell_path = "/bin/bash" +server_admin_bind_path = "/var/run/kanidmd/sock" +server_ui_pkg_path = "/usr/share/kanidm/ui/hpkg" +server_config_path = "/etc/kanidm/server.toml" +resolver_config_path = "/etc/kanidm/unixd" +resolver_unix_shell_path = "/bin/bash" diff --git a/libs/profiles/src/lib.rs b/libs/profiles/src/lib.rs index 6af08f586..784987130 100644 --- a/libs/profiles/src/lib.rs +++ b/libs/profiles/src/lib.rs @@ -54,12 +54,13 @@ impl std::fmt::Display for CpuOptLevel { #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct ProfileConfig { - htmx_ui_pkg_path: String, #[serde(default)] cpu_flags: CpuOptLevel, - admin_bind_path: String, - default_config_path: String, - default_unix_shell_path: String, + server_admin_bind_path: String, + server_config_path: String, + server_ui_pkg_path: String, + resolver_config_path: String, + resolver_unix_shell_path: String, } pub fn apply_profile() { @@ -127,19 +128,23 @@ pub fn apply_profile() { println!("cargo:rustc-env=KANIDM_PROFILE_NAME={}", profile); println!("cargo:rustc-env=KANIDM_CPU_FLAGS={}", profile_cfg.cpu_flags); println!( - "cargo:rustc-env=KANIDM_HTMX_UI_PKG_PATH={}", - profile_cfg.htmx_ui_pkg_path + "cargo:rustc-env=KANIDM_SERVER_UI_PKG_PATH={}", + profile_cfg.server_ui_pkg_path ); println!( - "cargo:rustc-env=KANIDM_ADMIN_BIND_PATH={}", - profile_cfg.admin_bind_path + "cargo:rustc-env=KANIDM_SERVER_ADMIN_BIND_PATH={}", + profile_cfg.server_admin_bind_path ); println!( - "cargo:rustc-env=KANIDM_DEFAULT_CONFIG_PATH={}", - profile_cfg.default_config_path + "cargo:rustc-env=KANIDM_SERVER_CONFIG_PATH={}", + profile_cfg.server_config_path ); println!( - "cargo:rustc-env=KANIDM_DEFAULT_UNIX_SHELL_PATH={}", - profile_cfg.default_unix_shell_path + "cargo:rustc-env=KANIDM_RESOLVER_CONFIG_PATH={}", + profile_cfg.resolver_config_path + ); + println!( + "cargo:rustc-env=KANIDM_RESOLVER_UNIX_SHELL_PATH={}", + profile_cfg.resolver_unix_shell_path ); } diff --git a/platform/freebsd/README.md b/platform/freebsd/README.md new file mode 100644 index 000000000..87de87ed6 --- /dev/null +++ b/platform/freebsd/README.md @@ -0,0 +1,4 @@ +These are the FreeBSD port Makefiles and other supporting files. In the future we will submit +these to FreeBSD ports rather than maintaining them here. + + diff --git a/platform/freebsd/client/Makefile b/platform/freebsd/client/Makefile new file mode 100644 index 000000000..f54e0e672 --- /dev/null +++ b/platform/freebsd/client/Makefile @@ -0,0 +1,49 @@ + +PORTNAME= kanidm +# DISTVERSION= 1.5.0-dev +# DISTVERSIONPREFIX= v + +DISTVERSION= g20250102 +GH_TAGNAME= edb8cccc84e9dacd2ac31ea1162dd24c0c454c55 +GH_ACCOUNT= Firstyear + +CATEGORIES= security net databases + +LICENSE= MPL20 +LICENSE_FILE= ${WRKSRC}/LICENSE.md +MAINTAINER= william@blackhats.net.au +COMMENT= Simple and secure identity management platform +WWW= https://github.com/kanidm/kanidm/ + +USES= cargo ssl +USE_GITHUB= yes + +ONLY_FOR_ARCHS= aarch64 amd64 + +CARGO_ENV= KANIDM_BUILD_PROFILE=release_freebsd + +CARGO_BUILD_ARGS = -p kanidm_tools -p kanidm_unix_int -p nss_kanidm -p pam_kanidm + +CARGO_INSTALL= no + +USE_RC_SUBR= kanidm_unixd kanidm_unixd_tasks + +USERS= _kanidm_unixd +GROUPS= _kanidm_unixd + +do-install: + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm ${STAGEDIR}${PREFIX}/bin + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm-unix ${STAGEDIR}${PREFIX}/bin + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm_ssh_authorizedkeys ${STAGEDIR}${PREFIX}/bin + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm_ssh_authorizedkeys_direct ${STAGEDIR}${PREFIX}/bin + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm_unixd ${STAGEDIR}${PREFIX}/libexec + ${INSTALL_PROGRAM} ${WRKDIR}/target/release/kanidm_unixd_tasks ${STAGEDIR}${PREFIX}/libexec + ${INSTALL_LIB} ${WRKDIR}/target/release/libnss_kanidm.so ${STAGEDIR}${PREFIX}/lib/nss_kanidm.so.1 + ${INSTALL_LIB} ${WRKDIR}/target/release/libpam_kanidm.so ${STAGEDIR}${PREFIX}/lib + ${MKDIR} ${STAGEDIR}${PREFIX}/etc + ${MKDIR} ${STAGEDIR}${PREFIX}/etc/kanidm + ${MKDIR} ${STAGEDIR}/var/run/kanidm-unixd + ${MKDIR} ${STAGEDIR}/var/lib/kanidm-unixd + ${MKDIR} ${STAGEDIR}/var/cache/kanidm-unixd + +.include diff --git a/platform/freebsd/client/Makefile.crates b/platform/freebsd/client/Makefile.crates new file mode 100644 index 000000000..461710e09 --- /dev/null +++ b/platform/freebsd/client/Makefile.crates @@ -0,0 +1,624 @@ +CARGO_CRATES= addr2line-0.24.2 \ + adler2-2.0.0 \ + ahash-0.8.11 \ + aho-corasick-1.1.3 \ + allocator-api2-0.2.21 \ + android-tzdata-0.1.1 \ + android_system_properties-0.1.5 \ + anstream-0.6.18 \ + anstyle-1.0.10 \ + anstyle-parse-0.2.6 \ + anstyle-query-1.1.2 \ + anstyle-wincon-3.0.6 \ + anyhow-1.0.95 \ + arc-swap-1.7.1 \ + argon2-0.5.3 \ + askama-0.12.1 \ + askama_axum-0.4.0 \ + askama_derive-0.12.5 \ + askama_escape-0.10.3 \ + askama_parser-0.2.1 \ + asn1-rs-0.6.2 \ + asn1-rs-derive-0.5.1 \ + asn1-rs-impl-0.2.0 \ + assert_cmd-2.0.16 \ + async-compression-0.4.18 \ + async-stream-0.3.6 \ + async-stream-impl-0.3.6 \ + async-trait-0.1.83 \ + atomic-waker-1.1.2 \ + authenticator-0.4.1 \ + autocfg-1.4.0 \ + axum-0.6.20 \ + axum-0.7.9 \ + axum-core-0.3.4 \ + axum-core-0.4.5 \ + axum-extra-0.9.6 \ + axum-htmx-0.5.0 \ + axum-macros-0.4.2 \ + axum-server-0.7.1 \ + backtrace-0.3.74 \ + base32-0.5.1 \ + base64-0.13.1 \ + base64-0.21.7 \ + base64-0.22.1 \ + base64ct-1.6.0 \ + base64urlsafedata-0.5.1 \ + basic-toml-0.1.9 \ + bindgen-0.66.1 \ + bindgen-0.70.1 \ + bit-set-0.5.3 \ + bit-set-0.8.0 \ + bit-vec-0.6.3 \ + bit-vec-0.8.0 \ + bitfield-0.13.2 \ + bitflags-1.3.2 \ + bitflags-2.6.0 \ + blake2-0.10.6 \ + block-buffer-0.10.4 \ + borrow-or-share-0.2.2 \ + bstr-1.11.1 \ + bumpalo-3.16.0 \ + bytecount-0.6.8 \ + bytemuck-1.21.0 \ + byteorder-1.5.0 \ + bytes-1.9.0 \ + cc-1.2.5 \ + cexpr-0.6.0 \ + cfg-if-1.0.0 \ + cfg_aliases-0.2.1 \ + checked_int_cast-1.0.0 \ + chrono-0.4.39 \ + clang-sys-1.8.1 \ + clap-4.5.23 \ + clap_builder-4.5.23 \ + clap_complete-4.5.40 \ + clap_derive-4.5.18 \ + clap_lex-0.7.4 \ + clru-0.6.2 \ + color_quant-1.1.0 \ + colorchoice-1.0.3 \ + compact_jwt-0.4.3 \ + concread-0.5.3 \ + console-0.15.10 \ + const-oid-0.9.6 \ + cookie-0.16.2 \ + cookie-0.18.1 \ + cookie_store-0.21.1 \ + core-foundation-0.9.4 \ + core-foundation-0.10.0 \ + core-foundation-sys-0.8.7 \ + cpufeatures-0.2.16 \ + crc32fast-1.4.2 \ + cron-0.12.1 \ + crossbeam-0.8.4 \ + crossbeam-channel-0.5.14 \ + crossbeam-deque-0.8.6 \ + crossbeam-epoch-0.9.18 \ + crossbeam-queue-0.3.12 \ + crossbeam-utils-0.8.21 \ + crypto-common-0.1.6 \ + csv-1.3.1 \ + csv-core-0.1.11 \ + darling-0.14.4 \ + darling-0.20.10 \ + darling_core-0.14.4 \ + darling_core-0.20.10 \ + darling_macro-0.14.4 \ + darling_macro-0.20.10 \ + data-encoding-2.6.0 \ + der-0.7.9 \ + der-parser-9.0.0 \ + der_derive-0.7.3 \ + deranged-0.3.11 \ + derive_builder-0.12.0 \ + derive_builder_core-0.12.0 \ + derive_builder_macro-0.12.0 \ + devd-rs-0.3.6 \ + dhat-0.3.3 \ + dialoguer-0.10.4 \ + difflib-0.4.0 \ + digest-0.10.7 \ + dirs-4.0.0 \ + dirs-sys-0.3.7 \ + displaydoc-0.2.5 \ + doc-comment-0.3.3 \ + document-features-0.2.10 \ + dunce-1.0.5 \ + dyn-clone-1.0.17 \ + either-1.13.0 \ + email_address-0.2.9 \ + encode_unicode-1.0.0 \ + encoding_rs-0.8.35 \ + enum-iterator-2.1.0 \ + enum-iterator-derive-1.4.0 \ + enumflags2-0.7.10 \ + enumflags2_derive-0.7.10 \ + equivalent-1.0.1 \ + errno-0.3.10 \ + escargot-0.5.13 \ + fallible-iterator-0.2.0 \ + fallible-streaming-iterator-0.1.9 \ + fancy-regex-0.11.0 \ + fancy-regex-0.14.0 \ + fantoccini-0.21.3 \ + faster-hex-0.9.0 \ + fastrand-2.3.0 \ + fernet-0.2.2 \ + file-id-0.1.0 \ + filetime-0.2.25 \ + fixedbitset-0.4.2 \ + flagset-0.4.6 \ + flate2-1.0.35 \ + fluent-uri-0.3.2 \ + fnv-1.0.7 \ + foldhash-0.1.4 \ + foreign-types-0.3.2 \ + foreign-types-shared-0.1.1 \ + form_urlencoded-1.2.1 \ + fraction-0.15.3 \ + fs4-0.8.4 \ + fsevent-sys-4.1.0 \ + futures-0.3.31 \ + futures-channel-0.3.31 \ + futures-core-0.3.31 \ + futures-executor-0.3.31 \ + futures-io-0.3.31 \ + futures-macro-0.3.31 \ + futures-sink-0.3.31 \ + futures-task-0.3.31 \ + futures-util-0.3.31 \ + generic-array-0.14.7 \ + gethostname-0.5.0 \ + getrandom-0.2.15 \ + gif-0.13.1 \ + gimli-0.31.1 \ + gix-0.64.0 \ + gix-actor-0.31.5 \ + gix-chunk-0.4.10 \ + gix-commitgraph-0.24.3 \ + gix-config-0.38.0 \ + gix-config-value-0.14.10 \ + gix-date-0.8.7 \ + gix-diff-0.44.1 \ + gix-discover-0.33.0 \ + gix-features-0.38.2 \ + gix-fs-0.11.3 \ + gix-glob-0.16.5 \ + gix-hash-0.14.2 \ + gix-hashtable-0.5.2 \ + gix-lock-14.0.0 \ + gix-macros-0.1.5 \ + gix-object-0.42.3 \ + gix-odb-0.61.1 \ + gix-pack-0.51.1 \ + gix-path-0.10.13 \ + gix-quote-0.4.14 \ + gix-ref-0.45.0 \ + gix-refspec-0.23.1 \ + gix-revision-0.27.2 \ + gix-revwalk-0.13.2 \ + gix-sec-0.10.10 \ + gix-tempfile-14.0.2 \ + gix-trace-0.1.11 \ + gix-traverse-0.39.2 \ + gix-url-0.27.5 \ + gix-utils-0.1.13 \ + gix-validate-0.8.5 \ + glob-0.3.1 \ + h2-0.3.26 \ + h2-0.4.7 \ + half-1.8.3 \ + hashbrown-0.12.3 \ + hashbrown-0.14.5 \ + hashbrown-0.15.2 \ + hashlink-0.8.4 \ + heck-0.5.0 \ + hex-0.4.3 \ + home-0.5.11 \ + hostname-validator-1.1.1 \ + http-0.2.12 \ + http-1.2.0 \ + http-body-0.4.6 \ + http-body-1.0.1 \ + http-body-util-0.1.2 \ + http-range-header-0.4.2 \ + httparse-1.9.5 \ + httpdate-1.0.3 \ + humansize-2.1.3 \ + hyper-0.14.32 \ + hyper-1.5.2 \ + hyper-rustls-0.24.2 \ + hyper-rustls-0.27.5 \ + hyper-timeout-0.4.1 \ + hyper-tls-0.6.0 \ + hyper-util-0.1.10 \ + iana-time-zone-0.1.61 \ + iana-time-zone-haiku-0.1.2 \ + icu_collections-1.5.0 \ + icu_locid-1.5.0 \ + icu_locid_transform-1.5.0 \ + icu_locid_transform_data-1.5.0 \ + icu_normalizer-1.5.0 \ + icu_normalizer_data-1.5.0 \ + icu_properties-1.5.1 \ + icu_properties_data-1.5.0 \ + icu_provider-1.5.0 \ + icu_provider_macros-1.5.0 \ + ident_case-1.0.1 \ + idlset-0.2.5 \ + idna-1.0.3 \ + idna_adapter-1.2.0 \ + image-0.23.14 \ + image-0.24.9 \ + indexmap-1.9.3 \ + indexmap-2.7.0 \ + inotify-0.9.6 \ + inotify-sys-0.1.5 \ + ipnet-2.10.1 \ + is_terminal_polyfill-1.70.1 \ + itertools-0.10.5 \ + itertools-0.13.0 \ + itoa-1.0.14 \ + jpeg-decoder-0.3.1 \ + js-sys-0.3.76 \ + jsonschema-0.28.0 \ + kanidm-hsm-crypto-0.2.0 \ + kqueue-1.0.8 \ + kqueue-sys-1.0.4 \ + lazy_static-1.5.0 \ + lazycell-1.3.0 \ + lber-0.4.2 \ + ldap3_client-0.5.2 \ + ldap3_proto-0.5.2 \ + libc-0.2.169 \ + libloading-0.8.6 \ + libm-0.2.11 \ + libmimalloc-sys-0.1.39 \ + libnss-0.8.0 \ + libredox-0.1.3 \ + libsqlite3-sys-0.25.2 \ + libudev-0.2.0 \ + libudev-sys-0.1.4 \ + linux-raw-sys-0.4.14 \ + litemap-0.7.4 \ + litrs-0.4.1 \ + lock_api-0.4.12 \ + lodepng-3.10.7 \ + log-0.4.22 \ + lru-0.12.5 \ + malloced-1.3.1 \ + matchers-0.1.0 \ + matchit-0.7.3 \ + mathru-0.13.0 \ + memchr-2.7.4 \ + memmap2-0.9.5 \ + memoffset-0.8.0 \ + mimalloc-0.1.43 \ + mime-0.3.17 \ + mime_guess-2.0.5 \ + minimal-lexical-0.2.1 \ + miniz_oxide-0.8.2 \ + mintex-0.1.3 \ + mio-0.8.11 \ + mio-1.0.3 \ + multer-3.1.0 \ + native-tls-0.2.12 \ + nix-0.29.0 \ + nom-7.1.3 \ + nonempty-0.8.1 \ + notify-6.1.1 \ + notify-debouncer-full-0.1.0 \ + nu-ansi-term-0.46.0 \ + num-0.4.3 \ + num-bigint-0.4.6 \ + num-cmp-0.1.0 \ + num-complex-0.4.6 \ + num-conv-0.1.0 \ + num-derive-0.3.3 \ + num-integer-0.1.46 \ + num-iter-0.1.45 \ + num-rational-0.3.2 \ + num-rational-0.4.2 \ + num-traits-0.2.19 \ + num_enum-0.5.11 \ + num_enum_derive-0.5.11 \ + num_threads-0.1.7 \ + oauth2-4.4.2 \ + object-0.36.5 \ + oid-0.2.1 \ + oid-registry-0.7.1 \ + once_cell-1.20.2 \ + openssl-0.10.68 \ + openssl-macros-0.1.1 \ + openssl-probe-0.1.5 \ + openssl-sys-0.9.104 \ + opentelemetry-0.20.0 \ + opentelemetry-http-0.9.0 \ + opentelemetry-otlp-0.13.0 \ + opentelemetry-proto-0.3.0 \ + opentelemetry-semantic-conventions-0.12.0 \ + opentelemetry_api-0.20.0 \ + opentelemetry_sdk-0.20.0 \ + ordered-float-3.9.2 \ + outref-0.5.1 \ + overload-0.1.1 \ + parking_lot-0.12.3 \ + parking_lot_core-0.9.10 \ + password-hash-0.5.0 \ + paste-1.0.15 \ + peeking_take_while-0.1.2 \ + peg-0.8.4 \ + peg-macros-0.8.4 \ + peg-runtime-0.8.3 \ + pem-rfc7468-0.7.0 \ + percent-encoding-2.3.1 \ + petgraph-0.6.5 \ + picky-asn1-0.8.0 \ + picky-asn1-der-0.4.1 \ + picky-asn1-x509-0.12.0 \ + pin-project-1.1.7 \ + pin-project-internal-1.1.7 \ + pin-project-lite-0.2.15 \ + pin-utils-0.1.0 \ + pkg-config-0.3.31 \ + powerfmt-0.2.0 \ + ppv-lite86-0.2.20 \ + prctl-1.0.0 \ + predicates-3.1.3 \ + predicates-core-1.0.9 \ + predicates-tree-1.0.12 \ + prettyplease-0.2.25 \ + proc-macro-crate-1.3.1 \ + proc-macro-error-1.0.4 \ + proc-macro-error-attr-1.0.4 \ + proc-macro2-1.0.92 \ + prodash-28.0.0 \ + prost-0.11.9 \ + prost-derive-0.11.9 \ + psl-types-2.0.11 \ + publicsuffix-2.3.0 \ + qrcode-0.12.0 \ + quick-error-2.0.1 \ + quinn-0.11.6 \ + quinn-proto-0.11.9 \ + quinn-udp-0.5.9 \ + quote-1.0.38 \ + rand-0.8.5 \ + rand_chacha-0.3.1 \ + rand_core-0.6.4 \ + redox_syscall-0.5.8 \ + redox_users-0.4.6 \ + ref-cast-1.0.23 \ + ref-cast-impl-1.0.23 \ + reference-counted-singleton-0.1.5 \ + referencing-0.28.0 \ + regex-1.11.1 \ + regex-automata-0.1.10 \ + regex-automata-0.4.9 \ + regex-syntax-0.6.29 \ + regex-syntax-0.8.5 \ + reqwest-0.11.27 \ + reqwest-0.12.11 \ + rgb-0.8.50 \ + ring-0.17.8 \ + rpassword-5.0.1 \ + runloop-0.1.0 \ + rusqlite-0.28.0 \ + rust-embed-8.5.0 \ + rust-embed-impl-8.5.0 \ + rust-embed-utils-8.5.0 \ + rustc-demangle-0.1.24 \ + rustc-hash-1.1.0 \ + rustc-hash-2.1.0 \ + rusticata-macros-4.1.0 \ + rustix-0.38.42 \ + rustls-0.21.12 \ + rustls-0.23.20 \ + rustls-native-certs-0.8.1 \ + rustls-pemfile-1.0.4 \ + rustls-pemfile-2.2.0 \ + rustls-pki-types-1.10.1 \ + rustls-webpki-0.101.7 \ + rustls-webpki-0.102.8 \ + rustversion-1.0.18 \ + ryu-1.0.18 \ + same-file-1.0.6 \ + schannel-0.1.27 \ + scopeguard-1.2.0 \ + sct-0.7.1 \ + sd-notify-0.4.3 \ + security-framework-2.11.1 \ + security-framework-3.1.0 \ + security-framework-sys-2.13.0 \ + selinux-0.4.6 \ + selinux-sys-0.6.13 \ + semver-1.0.24 \ + serde-1.0.217 \ + serde_bytes-0.11.15 \ + serde_cbor-0.11.2 \ + serde_cbor_2-0.12.0-dev \ + serde_derive-1.0.217 \ + serde_json-1.0.134 \ + serde_path_to_error-0.1.16 \ + serde_urlencoded-0.7.1 \ + serde_with-3.12.0 \ + serde_with_macros-3.12.0 \ + sha-crypt-0.5.0 \ + sha1_smol-1.0.1 \ + sha2-0.10.8 \ + sharded-slab-0.1.7 \ + shell-words-1.1.0 \ + shellexpand-2.1.2 \ + shlex-1.3.0 \ + signal-hook-registry-1.4.2 \ + slab-0.4.9 \ + smallvec-1.13.2 \ + smartstring-1.0.1 \ + smolset-1.3.1 \ + socket2-0.5.8 \ + spin-0.9.8 \ + spki-0.7.3 \ + sptr-0.3.2 \ + sshkey-attest-0.5.0 \ + sshkeys-0.3.3 \ + stable_deref_trait-1.2.0 \ + static_assertions-1.1.0 \ + strsim-0.10.0 \ + strsim-0.11.1 \ + subtle-2.6.1 \ + svg-0.13.1 \ + syn-1.0.109 \ + syn-2.0.93 \ + sync_wrapper-0.1.2 \ + sync_wrapper-1.0.2 \ + synstructure-0.13.1 \ + system-configuration-0.5.1 \ + system-configuration-sys-0.5.0 \ + target-lexicon-0.12.16 \ + tempfile-3.14.0 \ + termtree-0.5.1 \ + thiserror-1.0.69 \ + thiserror-2.0.8 \ + thiserror-impl-1.0.69 \ + thiserror-impl-2.0.8 \ + thousands-0.2.0 \ + thread_local-1.1.8 \ + time-0.3.37 \ + time-core-0.1.2 \ + time-macros-0.2.19 \ + tinystr-0.7.6 \ + tinyvec-1.8.1 \ + tinyvec_macros-0.1.1 \ + tls_codec-0.4.1 \ + tls_codec_derive-0.4.1 \ + tokio-1.42.0 \ + tokio-io-timeout-1.2.0 \ + tokio-macros-2.4.0 \ + tokio-native-tls-0.3.1 \ + tokio-openssl-0.6.5 \ + tokio-rustls-0.24.1 \ + tokio-rustls-0.26.1 \ + tokio-stream-0.1.17 \ + tokio-util-0.7.13 \ + toml-0.5.11 \ + toml_datetime-0.6.8 \ + toml_edit-0.19.15 \ + tonic-0.9.2 \ + tower-0.4.13 \ + tower-0.5.2 \ + tower-http-0.6.2 \ + tower-layer-0.3.3 \ + tower-service-0.3.3 \ + tracing-0.1.41 \ + tracing-attributes-0.1.28 \ + tracing-core-0.1.33 \ + tracing-forest-0.1.6 \ + tracing-log-0.1.4 \ + tracing-log-0.2.0 \ + tracing-opentelemetry-0.21.0 \ + tracing-subscriber-0.3.19 \ + try-lock-0.2.5 \ + tss-esapi-8.0.0-alpha \ + tss-esapi-sys-0.5.0 \ + typenum-1.17.0 \ + unicase-2.8.0 \ + unicode-bom-2.0.3 \ + unicode-ident-1.0.14 \ + unicode-normalization-0.1.24 \ + unicode-segmentation-1.12.0 \ + unicode-width-0.2.0 \ + untrusted-0.9.0 \ + url-2.5.4 \ + urlencoding-2.1.3 \ + utf16_iter-1.0.5 \ + utf8_iter-1.0.4 \ + utf8parse-0.2.2 \ + utoipa-4.2.3 \ + utoipa-gen-4.3.1 \ + utoipa-swagger-ui-6.0.0 \ + uuid-1.11.0 \ + uuid-simd-0.8.0 \ + valuable-0.1.0 \ + vcpkg-0.2.15 \ + version_check-0.9.5 \ + vsimd-0.8.0 \ + wait-timeout-0.2.0 \ + walkdir-2.5.0 \ + want-0.3.1 \ + wasi-0.11.0+wasi-snapshot-preview1 \ + wasite-0.1.0 \ + wasm-bindgen-0.2.99 \ + wasm-bindgen-backend-0.2.99 \ + wasm-bindgen-futures-0.4.49 \ + wasm-bindgen-macro-0.2.99 \ + wasm-bindgen-macro-support-0.2.99 \ + wasm-bindgen-shared-0.2.99 \ + web-sys-0.3.76 \ + web-time-1.1.0 \ + webauthn-attestation-ca-0.5.1 \ + webauthn-authenticator-rs-0.5.1 \ + webauthn-rs-0.5.1 \ + webauthn-rs-core-0.5.1 \ + webauthn-rs-proto-0.5.1 \ + webdriver-0.50.0 \ + webpki-roots-0.25.4 \ + webpki-roots-0.26.7 \ + weezl-0.1.8 \ + which-4.4.2 \ + whoami-1.5.2 \ + winapi-0.3.9 \ + winapi-i686-pc-windows-gnu-0.4.0 \ + winapi-util-0.1.9 \ + winapi-x86_64-pc-windows-gnu-0.4.0 \ + windows-0.41.0 \ + windows-core-0.52.0 \ + windows-registry-0.2.0 \ + windows-result-0.2.0 \ + windows-strings-0.1.0 \ + windows-sys-0.48.0 \ + windows-sys-0.52.0 \ + windows-sys-0.59.0 \ + windows-targets-0.48.5 \ + windows-targets-0.52.6 \ + windows_aarch64_gnullvm-0.41.0 \ + windows_aarch64_gnullvm-0.48.5 \ + windows_aarch64_gnullvm-0.52.6 \ + windows_aarch64_msvc-0.41.0 \ + windows_aarch64_msvc-0.48.5 \ + windows_aarch64_msvc-0.52.6 \ + windows_i686_gnu-0.41.0 \ + windows_i686_gnu-0.48.5 \ + windows_i686_gnu-0.52.6 \ + windows_i686_gnullvm-0.52.6 \ + windows_i686_msvc-0.41.0 \ + windows_i686_msvc-0.48.5 \ + windows_i686_msvc-0.52.6 \ + windows_x86_64_gnu-0.41.0 \ + windows_x86_64_gnu-0.48.5 \ + windows_x86_64_gnu-0.52.6 \ + windows_x86_64_gnullvm-0.41.0 \ + windows_x86_64_gnullvm-0.48.5 \ + windows_x86_64_gnullvm-0.52.6 \ + windows_x86_64_msvc-0.41.0 \ + windows_x86_64_msvc-0.48.5 \ + windows_x86_64_msvc-0.52.6 \ + winnow-0.5.40 \ + winnow-0.6.20 \ + winreg-0.50.0 \ + write16-1.0.0 \ + writeable-0.5.5 \ + x509-cert-0.2.5 \ + x509-parser-0.16.0 \ + yoke-0.7.5 \ + yoke-derive-0.7.5 \ + zerocopy-0.7.35 \ + zerocopy-derive-0.7.35 \ + zerofrom-0.1.5 \ + zerofrom-derive-0.1.5 \ + zeroize-1.8.1 \ + zeroize_derive-1.4.2 \ + zerovec-0.10.4 \ + zerovec-derive-0.10.3 \ + zip-0.6.6 \ + zxcvbn-2.2.2 diff --git a/platform/freebsd/client/distinfo b/platform/freebsd/client/distinfo new file mode 100644 index 000000000..504decd07 --- /dev/null +++ b/platform/freebsd/client/distinfo @@ -0,0 +1,1251 @@ +TIMESTAMP = 1735779262 +SHA256 (rust/crates/addr2line-0.24.2.crate) = dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1 +SIZE (rust/crates/addr2line-0.24.2.crate) = 39015 +SHA256 (rust/crates/adler2-2.0.0.crate) = 512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627 +SIZE (rust/crates/adler2-2.0.0.crate) = 13529 +SHA256 (rust/crates/ahash-0.8.11.crate) = e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011 +SIZE (rust/crates/ahash-0.8.11.crate) = 43607 +SHA256 (rust/crates/aho-corasick-1.1.3.crate) = 8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916 +SIZE (rust/crates/aho-corasick-1.1.3.crate) = 183311 +SHA256 (rust/crates/allocator-api2-0.2.21.crate) = 683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923 +SIZE (rust/crates/allocator-api2-0.2.21.crate) = 63622 +SHA256 (rust/crates/android-tzdata-0.1.1.crate) = e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0 +SIZE (rust/crates/android-tzdata-0.1.1.crate) = 7674 +SHA256 (rust/crates/android_system_properties-0.1.5.crate) = 819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311 +SIZE (rust/crates/android_system_properties-0.1.5.crate) = 5243 +SHA256 (rust/crates/anstream-0.6.18.crate) = 8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b +SIZE (rust/crates/anstream-0.6.18.crate) = 29681 +SHA256 (rust/crates/anstyle-1.0.10.crate) = 55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9 +SIZE (rust/crates/anstyle-1.0.10.crate) = 15725 +SHA256 (rust/crates/anstyle-parse-0.2.6.crate) = 3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9 +SIZE (rust/crates/anstyle-parse-0.2.6.crate) = 22343 +SHA256 (rust/crates/anstyle-query-1.1.2.crate) = 79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c +SIZE (rust/crates/anstyle-query-1.1.2.crate) = 9969 +SHA256 (rust/crates/anstyle-wincon-3.0.6.crate) = 2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125 +SIZE (rust/crates/anstyle-wincon-3.0.6.crate) = 12271 +SHA256 (rust/crates/anyhow-1.0.95.crate) = 34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04 +SIZE (rust/crates/anyhow-1.0.95.crate) = 52155 +SHA256 (rust/crates/arc-swap-1.7.1.crate) = 69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457 +SIZE (rust/crates/arc-swap-1.7.1.crate) = 68512 +SHA256 (rust/crates/argon2-0.5.3.crate) = 3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072 +SIZE (rust/crates/argon2-0.5.3.crate) = 28795 +SHA256 (rust/crates/askama-0.12.1.crate) = b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28 +SIZE (rust/crates/askama-0.12.1.crate) = 16976 +SHA256 (rust/crates/askama_axum-0.4.0.crate) = a41603f7cdbf5ac4af60760f17253eb6adf6ec5b6f14a7ed830cf687d375f163 +SIZE (rust/crates/askama_axum-0.4.0.crate) = 6649 +SHA256 (rust/crates/askama_derive-0.12.5.crate) = 19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83 +SIZE (rust/crates/askama_derive-0.12.5.crate) = 31218 +SHA256 (rust/crates/askama_escape-0.10.3.crate) = 619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341 +SIZE (rust/crates/askama_escape-0.10.3.crate) = 8875 +SHA256 (rust/crates/askama_parser-0.2.1.crate) = acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0 +SIZE (rust/crates/askama_parser-0.2.1.crate) = 20707 +SHA256 (rust/crates/asn1-rs-0.6.2.crate) = 5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048 +SIZE (rust/crates/asn1-rs-0.6.2.crate) = 90647 +SHA256 (rust/crates/asn1-rs-derive-0.5.1.crate) = 965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490 +SIZE (rust/crates/asn1-rs-derive-0.5.1.crate) = 9692 +SHA256 (rust/crates/asn1-rs-impl-0.2.0.crate) = 7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7 +SIZE (rust/crates/asn1-rs-impl-0.2.0.crate) = 2261 +SHA256 (rust/crates/assert_cmd-2.0.16.crate) = dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d +SIZE (rust/crates/assert_cmd-2.0.16.crate) = 26554 +SHA256 (rust/crates/async-compression-0.4.18.crate) = df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522 +SIZE (rust/crates/async-compression-0.4.18.crate) = 111919 +SHA256 (rust/crates/async-stream-0.3.6.crate) = 0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476 +SIZE (rust/crates/async-stream-0.3.6.crate) = 13823 +SHA256 (rust/crates/async-stream-impl-0.3.6.crate) = c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d +SIZE (rust/crates/async-stream-impl-0.3.6.crate) = 4312 +SHA256 (rust/crates/async-trait-0.1.83.crate) = 721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd +SIZE (rust/crates/async-trait-0.1.83.crate) = 29054 +SHA256 (rust/crates/atomic-waker-1.1.2.crate) = 1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0 +SIZE (rust/crates/atomic-waker-1.1.2.crate) = 12422 +SHA256 (rust/crates/authenticator-0.4.1.crate) = 82d71e457dc518a15eecc90d3b0660dee4b51623b34ac4262c9326e0d7e0f8e2 +SIZE (rust/crates/authenticator-0.4.1.crate) = 198210 +SHA256 (rust/crates/autocfg-1.4.0.crate) = ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26 +SIZE (rust/crates/autocfg-1.4.0.crate) = 17712 +SHA256 (rust/crates/axum-0.6.20.crate) = 3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf +SIZE (rust/crates/axum-0.6.20.crate) = 146227 +SHA256 (rust/crates/axum-0.7.9.crate) = edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f +SIZE (rust/crates/axum-0.7.9.crate) = 155272 +SHA256 (rust/crates/axum-core-0.3.4.crate) = 759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c +SIZE (rust/crates/axum-core-0.3.4.crate) = 21088 +SHA256 (rust/crates/axum-core-0.4.5.crate) = 09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199 +SIZE (rust/crates/axum-core-0.4.5.crate) = 22183 +SHA256 (rust/crates/axum-extra-0.9.6.crate) = c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04 +SIZE (rust/crates/axum-extra-0.9.6.crate) = 47663 +SHA256 (rust/crates/axum-htmx-0.5.0.crate) = 40f7051fdc094b6e5ea06cab9bca4b198c54dee4472a9419155f0ff19f19901e +SIZE (rust/crates/axum-htmx-0.5.0.crate) = 15894 +SHA256 (rust/crates/axum-macros-0.4.2.crate) = 57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce +SIZE (rust/crates/axum-macros-0.4.2.crate) = 39245 +SHA256 (rust/crates/axum-server-0.7.1.crate) = 56bac90848f6a9393ac03c63c640925c4b7c8ca21654de40d53f55964667c7d8 +SIZE (rust/crates/axum-server-0.7.1.crate) = 41684 +SHA256 (rust/crates/backtrace-0.3.74.crate) = 8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a +SIZE (rust/crates/backtrace-0.3.74.crate) = 88516 +SHA256 (rust/crates/base32-0.5.1.crate) = 022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076 +SIZE (rust/crates/base32-0.5.1.crate) = 9238 +SHA256 (rust/crates/base64-0.13.1.crate) = 9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8 +SIZE (rust/crates/base64-0.13.1.crate) = 61002 +SHA256 (rust/crates/base64-0.21.7.crate) = 9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567 +SIZE (rust/crates/base64-0.21.7.crate) = 82576 +SHA256 (rust/crates/base64-0.22.1.crate) = 72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6 +SIZE (rust/crates/base64-0.22.1.crate) = 81597 +SHA256 (rust/crates/base64ct-1.6.0.crate) = 8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b +SIZE (rust/crates/base64ct-1.6.0.crate) = 28870 +SHA256 (rust/crates/base64urlsafedata-0.5.1.crate) = 72f0ad38ce7fbed55985ad5b2197f05cff8324ee6eb6638304e78f0108fae56c +SIZE (rust/crates/base64urlsafedata-0.5.1.crate) = 5683 +SHA256 (rust/crates/basic-toml-0.1.9.crate) = 823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8 +SIZE (rust/crates/basic-toml-0.1.9.crate) = 50234 +SHA256 (rust/crates/bindgen-0.66.1.crate) = f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7 +SIZE (rust/crates/bindgen-0.66.1.crate) = 218860 +SHA256 (rust/crates/bindgen-0.70.1.crate) = f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f +SIZE (rust/crates/bindgen-0.70.1.crate) = 226363 +SHA256 (rust/crates/bit-set-0.5.3.crate) = 0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1 +SIZE (rust/crates/bit-set-0.5.3.crate) = 14470 +SHA256 (rust/crates/bit-set-0.8.0.crate) = 08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3 +SIZE (rust/crates/bit-set-0.8.0.crate) = 16289 +SHA256 (rust/crates/bit-vec-0.6.3.crate) = 349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb +SIZE (rust/crates/bit-vec-0.6.3.crate) = 19927 +SHA256 (rust/crates/bit-vec-0.8.0.crate) = 5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7 +SIZE (rust/crates/bit-vec-0.8.0.crate) = 24132 +SHA256 (rust/crates/bitfield-0.13.2.crate) = 46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719 +SIZE (rust/crates/bitfield-0.13.2.crate) = 16479 +SHA256 (rust/crates/bitflags-1.3.2.crate) = bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a +SIZE (rust/crates/bitflags-1.3.2.crate) = 23021 +SHA256 (rust/crates/bitflags-2.6.0.crate) = b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de +SIZE (rust/crates/bitflags-2.6.0.crate) = 45357 +SHA256 (rust/crates/blake2-0.10.6.crate) = 46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe +SIZE (rust/crates/blake2-0.10.6.crate) = 47234 +SHA256 (rust/crates/block-buffer-0.10.4.crate) = 3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71 +SIZE (rust/crates/block-buffer-0.10.4.crate) = 10538 +SHA256 (rust/crates/borrow-or-share-0.2.2.crate) = 3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32 +SIZE (rust/crates/borrow-or-share-0.2.2.crate) = 4871 +SHA256 (rust/crates/bstr-1.11.1.crate) = 786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8 +SIZE (rust/crates/bstr-1.11.1.crate) = 351485 +SHA256 (rust/crates/bumpalo-3.16.0.crate) = 79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c +SIZE (rust/crates/bumpalo-3.16.0.crate) = 85677 +SHA256 (rust/crates/bytecount-0.6.8.crate) = 5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce +SIZE (rust/crates/bytecount-0.6.8.crate) = 14694 +SHA256 (rust/crates/bytemuck-1.21.0.crate) = ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3 +SIZE (rust/crates/bytemuck-1.21.0.crate) = 51553 +SHA256 (rust/crates/byteorder-1.5.0.crate) = 1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b +SIZE (rust/crates/byteorder-1.5.0.crate) = 23288 +SHA256 (rust/crates/bytes-1.9.0.crate) = 325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b +SIZE (rust/crates/bytes-1.9.0.crate) = 67320 +SHA256 (rust/crates/cc-1.2.5.crate) = c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e +SIZE (rust/crates/cc-1.2.5.crate) = 99839 +SHA256 (rust/crates/cexpr-0.6.0.crate) = 6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766 +SIZE (rust/crates/cexpr-0.6.0.crate) = 17966 +SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd +SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934 +SHA256 (rust/crates/cfg_aliases-0.2.1.crate) = 613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724 +SIZE (rust/crates/cfg_aliases-0.2.1.crate) = 6355 +SHA256 (rust/crates/checked_int_cast-1.0.0.crate) = 17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919 +SIZE (rust/crates/checked_int_cast-1.0.0.crate) = 2669 +SHA256 (rust/crates/chrono-0.4.39.crate) = 7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825 +SIZE (rust/crates/chrono-0.4.39.crate) = 222248 +SHA256 (rust/crates/clang-sys-1.8.1.crate) = 0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4 +SIZE (rust/crates/clang-sys-1.8.1.crate) = 44009 +SHA256 (rust/crates/clap-4.5.23.crate) = 3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84 +SIZE (rust/crates/clap-4.5.23.crate) = 56460 +SHA256 (rust/crates/clap_builder-4.5.23.crate) = 30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838 +SIZE (rust/crates/clap_builder-4.5.23.crate) = 164180 +SHA256 (rust/crates/clap_complete-4.5.40.crate) = ac2e663e3e3bed2d32d065a8404024dad306e699a04263ec59919529f803aee9 +SIZE (rust/crates/clap_complete-4.5.40.crate) = 47827 +SHA256 (rust/crates/clap_derive-4.5.18.crate) = 4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab +SIZE (rust/crates/clap_derive-4.5.18.crate) = 30131 +SHA256 (rust/crates/clap_lex-0.7.4.crate) = f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6 +SIZE (rust/crates/clap_lex-0.7.4.crate) = 12858 +SHA256 (rust/crates/clru-0.6.2.crate) = cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59 +SIZE (rust/crates/clru-0.6.2.crate) = 16497 +SHA256 (rust/crates/color_quant-1.1.0.crate) = 3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b +SIZE (rust/crates/color_quant-1.1.0.crate) = 6649 +SHA256 (rust/crates/colorchoice-1.0.3.crate) = 5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990 +SIZE (rust/crates/colorchoice-1.0.3.crate) = 7923 +SHA256 (rust/crates/compact_jwt-0.4.3.crate) = 12bbab6445446e8d0b07468a01d0bfdae15879de5c440c5e47ae4ae0e18a1fba +SIZE (rust/crates/compact_jwt-0.4.3.crate) = 61901 +SHA256 (rust/crates/concread-0.5.3.crate) = cba00cef522c2597dfbb0a8d1b0ac8ac2b99714f50cc354cda71da63164da0be +SIZE (rust/crates/concread-0.5.3.crate) = 877996 +SHA256 (rust/crates/console-0.15.10.crate) = ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b +SIZE (rust/crates/console-0.15.10.crate) = 36449 +SHA256 (rust/crates/const-oid-0.9.6.crate) = c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8 +SIZE (rust/crates/const-oid-0.9.6.crate) = 45382 +SHA256 (rust/crates/cookie-0.16.2.crate) = e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb +SIZE (rust/crates/cookie-0.16.2.crate) = 34632 +SHA256 (rust/crates/cookie-0.18.1.crate) = 4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747 +SIZE (rust/crates/cookie-0.18.1.crate) = 43551 +SHA256 (rust/crates/cookie_store-0.21.1.crate) = 2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9 +SIZE (rust/crates/cookie_store-0.21.1.crate) = 34692 +SHA256 (rust/crates/core-foundation-0.9.4.crate) = 91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f +SIZE (rust/crates/core-foundation-0.9.4.crate) = 27743 +SHA256 (rust/crates/core-foundation-0.10.0.crate) = b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63 +SIZE (rust/crates/core-foundation-0.10.0.crate) = 27023 +SHA256 (rust/crates/core-foundation-sys-0.8.7.crate) = 773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b +SIZE (rust/crates/core-foundation-sys-0.8.7.crate) = 37712 +SHA256 (rust/crates/cpufeatures-0.2.16.crate) = 16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3 +SIZE (rust/crates/cpufeatures-0.2.16.crate) = 13405 +SHA256 (rust/crates/crc32fast-1.4.2.crate) = a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3 +SIZE (rust/crates/crc32fast-1.4.2.crate) = 38491 +SHA256 (rust/crates/cron-0.12.1.crate) = 6f8c3e73077b4b4a6ab1ea5047c37c57aee77657bc8ecd6f29b0af082d0b0c07 +SIZE (rust/crates/cron-0.12.1.crate) = 18702 +SHA256 (rust/crates/crossbeam-0.8.4.crate) = 1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8 +SIZE (rust/crates/crossbeam-0.8.4.crate) = 10500 +SHA256 (rust/crates/crossbeam-channel-0.5.14.crate) = 06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471 +SIZE (rust/crates/crossbeam-channel-0.5.14.crate) = 92728 +SHA256 (rust/crates/crossbeam-deque-0.8.6.crate) = 9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51 +SIZE (rust/crates/crossbeam-deque-0.8.6.crate) = 22471 +SHA256 (rust/crates/crossbeam-epoch-0.9.18.crate) = 5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e +SIZE (rust/crates/crossbeam-epoch-0.9.18.crate) = 46875 +SHA256 (rust/crates/crossbeam-queue-0.3.12.crate) = 0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115 +SIZE (rust/crates/crossbeam-queue-0.3.12.crate) = 16270 +SHA256 (rust/crates/crossbeam-utils-0.8.21.crate) = d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28 +SIZE (rust/crates/crossbeam-utils-0.8.21.crate) = 42691 +SHA256 (rust/crates/crypto-common-0.1.6.crate) = 1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3 +SIZE (rust/crates/crypto-common-0.1.6.crate) = 8760 +SHA256 (rust/crates/csv-1.3.1.crate) = acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf +SIZE (rust/crates/csv-1.3.1.crate) = 888542 +SHA256 (rust/crates/csv-core-0.1.11.crate) = 5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70 +SIZE (rust/crates/csv-core-0.1.11.crate) = 25852 +SHA256 (rust/crates/darling-0.14.4.crate) = 7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850 +SIZE (rust/crates/darling-0.14.4.crate) = 25168 +SHA256 (rust/crates/darling-0.20.10.crate) = 6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989 +SIZE (rust/crates/darling-0.20.10.crate) = 32031 +SHA256 (rust/crates/darling_core-0.14.4.crate) = 109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0 +SIZE (rust/crates/darling_core-0.14.4.crate) = 57485 +SHA256 (rust/crates/darling_core-0.20.10.crate) = 95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5 +SIZE (rust/crates/darling_core-0.20.10.crate) = 65015 +SHA256 (rust/crates/darling_macro-0.14.4.crate) = a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e +SIZE (rust/crates/darling_macro-0.14.4.crate) = 1896 +SHA256 (rust/crates/darling_macro-0.20.10.crate) = d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806 +SIZE (rust/crates/darling_macro-0.20.10.crate) = 1874 +SHA256 (rust/crates/data-encoding-2.6.0.crate) = e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2 +SIZE (rust/crates/data-encoding-2.6.0.crate) = 20769 +SHA256 (rust/crates/der-0.7.9.crate) = f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0 +SIZE (rust/crates/der-0.7.9.crate) = 85173 +SHA256 (rust/crates/der-parser-9.0.0.crate) = 5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553 +SIZE (rust/crates/der-parser-9.0.0.crate) = 63191 +SHA256 (rust/crates/der_derive-0.7.3.crate) = 8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18 +SIZE (rust/crates/der_derive-0.7.3.crate) = 24657 +SHA256 (rust/crates/deranged-0.3.11.crate) = b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4 +SIZE (rust/crates/deranged-0.3.11.crate) = 18043 +SHA256 (rust/crates/derive_builder-0.12.0.crate) = 8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8 +SIZE (rust/crates/derive_builder-0.12.0.crate) = 35456 +SHA256 (rust/crates/derive_builder_core-0.12.0.crate) = c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f +SIZE (rust/crates/derive_builder_core-0.12.0.crate) = 31438 +SHA256 (rust/crates/derive_builder_macro-0.12.0.crate) = ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e +SIZE (rust/crates/derive_builder_macro-0.12.0.crate) = 6288 +SHA256 (rust/crates/devd-rs-0.3.6.crate) = 9313f104b590510b46fc01c0a324fc76505c13871454d3c48490468d04c8d395 +SIZE (rust/crates/devd-rs-0.3.6.crate) = 6987 +SHA256 (rust/crates/dhat-0.3.3.crate) = 98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827 +SIZE (rust/crates/dhat-0.3.3.crate) = 32008 +SHA256 (rust/crates/dialoguer-0.10.4.crate) = 59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87 +SIZE (rust/crates/dialoguer-0.10.4.crate) = 29928 +SHA256 (rust/crates/difflib-0.4.0.crate) = 6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8 +SIZE (rust/crates/difflib-0.4.0.crate) = 7638 +SHA256 (rust/crates/digest-0.10.7.crate) = 9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292 +SIZE (rust/crates/digest-0.10.7.crate) = 19557 +SHA256 (rust/crates/dirs-4.0.0.crate) = ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059 +SIZE (rust/crates/dirs-4.0.0.crate) = 12503 +SHA256 (rust/crates/dirs-sys-0.3.7.crate) = 1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6 +SIZE (rust/crates/dirs-sys-0.3.7.crate) = 10597 +SHA256 (rust/crates/displaydoc-0.2.5.crate) = 97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0 +SIZE (rust/crates/displaydoc-0.2.5.crate) = 24219 +SHA256 (rust/crates/doc-comment-0.3.3.crate) = fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10 +SIZE (rust/crates/doc-comment-0.3.3.crate) = 4123 +SHA256 (rust/crates/document-features-0.2.10.crate) = cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0 +SIZE (rust/crates/document-features-0.2.10.crate) = 14005 +SHA256 (rust/crates/dunce-1.0.5.crate) = 92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813 +SIZE (rust/crates/dunce-1.0.5.crate) = 8244 +SHA256 (rust/crates/dyn-clone-1.0.17.crate) = 0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125 +SIZE (rust/crates/dyn-clone-1.0.17.crate) = 11848 +SHA256 (rust/crates/either-1.13.0.crate) = 60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0 +SIZE (rust/crates/either-1.13.0.crate) = 19169 +SHA256 (rust/crates/email_address-0.2.9.crate) = e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449 +SIZE (rust/crates/email_address-0.2.9.crate) = 21579 +SHA256 (rust/crates/encode_unicode-1.0.0.crate) = 34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0 +SIZE (rust/crates/encode_unicode-1.0.0.crate) = 56986 +SHA256 (rust/crates/encoding_rs-0.8.35.crate) = 75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3 +SIZE (rust/crates/encoding_rs-0.8.35.crate) = 1381050 +SHA256 (rust/crates/enum-iterator-2.1.0.crate) = c280b9e6b3ae19e152d8e31cf47f18389781e119d4013a2a2bb0180e5facc635 +SIZE (rust/crates/enum-iterator-2.1.0.crate) = 7668 +SHA256 (rust/crates/enum-iterator-derive-1.4.0.crate) = a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b +SIZE (rust/crates/enum-iterator-derive-1.4.0.crate) = 5516 +SHA256 (rust/crates/enumflags2-0.7.10.crate) = d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d +SIZE (rust/crates/enumflags2-0.7.10.crate) = 16622 +SHA256 (rust/crates/enumflags2_derive-0.7.10.crate) = de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8 +SIZE (rust/crates/enumflags2_derive-0.7.10.crate) = 8104 +SHA256 (rust/crates/equivalent-1.0.1.crate) = 5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5 +SIZE (rust/crates/equivalent-1.0.1.crate) = 6615 +SHA256 (rust/crates/errno-0.3.10.crate) = 33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d +SIZE (rust/crates/errno-0.3.10.crate) = 11824 +SHA256 (rust/crates/escargot-0.5.13.crate) = 05a3ac187a16b5382fef8c69fd1bad123c67b7cf3932240a2d43dcdd32cded88 +SIZE (rust/crates/escargot-0.5.13.crate) = 20849 +SHA256 (rust/crates/fallible-iterator-0.2.0.crate) = 4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7 +SIZE (rust/crates/fallible-iterator-0.2.0.crate) = 18509 +SHA256 (rust/crates/fallible-streaming-iterator-0.1.9.crate) = 7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a +SIZE (rust/crates/fallible-streaming-iterator-0.1.9.crate) = 9249 +SHA256 (rust/crates/fancy-regex-0.11.0.crate) = b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2 +SIZE (rust/crates/fancy-regex-0.11.0.crate) = 82918 +SHA256 (rust/crates/fancy-regex-0.14.0.crate) = 6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298 +SIZE (rust/crates/fancy-regex-0.14.0.crate) = 86969 +SHA256 (rust/crates/fantoccini-0.21.3.crate) = 8e681009c468d99de858e7757b0cfd5f16311ca999b13ccf543c87da3c04c2c5 +SIZE (rust/crates/fantoccini-0.21.3.crate) = 80146 +SHA256 (rust/crates/faster-hex-0.9.0.crate) = a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183 +SIZE (rust/crates/faster-hex-0.9.0.crate) = 13053 +SHA256 (rust/crates/fastrand-2.3.0.crate) = 37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be +SIZE (rust/crates/fastrand-2.3.0.crate) = 15076 +SHA256 (rust/crates/fernet-0.2.2.crate) = c66b725fe9483b9ee72ccaec072b15eb8ad95a3ae63a8c798d5748883b72fd33 +SIZE (rust/crates/fernet-0.2.2.crate) = 13494 +SHA256 (rust/crates/file-id-0.1.0.crate) = e13be71e6ca82e91bc0cb862bebaac0b2d1924a5a1d970c822b2f98b63fda8c3 +SIZE (rust/crates/file-id-0.1.0.crate) = 2094 +SHA256 (rust/crates/filetime-0.2.25.crate) = 35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586 +SIZE (rust/crates/filetime-0.2.25.crate) = 14940 +SHA256 (rust/crates/fixedbitset-0.4.2.crate) = 0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80 +SIZE (rust/crates/fixedbitset-0.4.2.crate) = 15954 +SHA256 (rust/crates/flagset-0.4.6.crate) = b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec +SIZE (rust/crates/flagset-0.4.6.crate) = 13623 +SHA256 (rust/crates/flate2-1.0.35.crate) = c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c +SIZE (rust/crates/flate2-1.0.35.crate) = 109188 +SHA256 (rust/crates/fluent-uri-0.3.2.crate) = 1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5 +SIZE (rust/crates/fluent-uri-0.3.2.crate) = 43604 +SHA256 (rust/crates/fnv-1.0.7.crate) = 3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1 +SIZE (rust/crates/fnv-1.0.7.crate) = 11266 +SHA256 (rust/crates/foldhash-0.1.4.crate) = a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f +SIZE (rust/crates/foldhash-0.1.4.crate) = 13764 +SHA256 (rust/crates/foreign-types-0.3.2.crate) = f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1 +SIZE (rust/crates/foreign-types-0.3.2.crate) = 7504 +SHA256 (rust/crates/foreign-types-shared-0.1.1.crate) = 00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b +SIZE (rust/crates/foreign-types-shared-0.1.1.crate) = 5672 +SHA256 (rust/crates/form_urlencoded-1.2.1.crate) = e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456 +SIZE (rust/crates/form_urlencoded-1.2.1.crate) = 8969 +SHA256 (rust/crates/fraction-0.15.3.crate) = 0f158e3ff0a1b334408dc9fb811cd99b446986f4d8b741bb08f9df1604085ae7 +SIZE (rust/crates/fraction-0.15.3.crate) = 95223 +SHA256 (rust/crates/fs4-0.8.4.crate) = f7e180ac76c23b45e767bd7ae9579bc0bb458618c4bc71835926e098e61d15f8 +SIZE (rust/crates/fs4-0.8.4.crate) = 18620 +SHA256 (rust/crates/fsevent-sys-4.1.0.crate) = 76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2 +SIZE (rust/crates/fsevent-sys-4.1.0.crate) = 4620 +SHA256 (rust/crates/futures-0.3.31.crate) = 65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876 +SIZE (rust/crates/futures-0.3.31.crate) = 54953 +SHA256 (rust/crates/futures-channel-0.3.31.crate) = 2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10 +SIZE (rust/crates/futures-channel-0.3.31.crate) = 31971 +SHA256 (rust/crates/futures-core-0.3.31.crate) = 05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e +SIZE (rust/crates/futures-core-0.3.31.crate) = 14318 +SHA256 (rust/crates/futures-executor-0.3.31.crate) = 1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f +SIZE (rust/crates/futures-executor-0.3.31.crate) = 17965 +SHA256 (rust/crates/futures-io-0.3.31.crate) = 9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6 +SIZE (rust/crates/futures-io-0.3.31.crate) = 9047 +SHA256 (rust/crates/futures-macro-0.3.31.crate) = 162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650 +SIZE (rust/crates/futures-macro-0.3.31.crate) = 11341 +SHA256 (rust/crates/futures-sink-0.3.31.crate) = e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7 +SIZE (rust/crates/futures-sink-0.3.31.crate) = 7958 +SHA256 (rust/crates/futures-task-0.3.31.crate) = f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988 +SIZE (rust/crates/futures-task-0.3.31.crate) = 11217 +SHA256 (rust/crates/futures-util-0.3.31.crate) = 9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81 +SIZE (rust/crates/futures-util-0.3.31.crate) = 162124 +SHA256 (rust/crates/generic-array-0.14.7.crate) = 85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a +SIZE (rust/crates/generic-array-0.14.7.crate) = 15950 +SHA256 (rust/crates/gethostname-0.5.0.crate) = dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30 +SIZE (rust/crates/gethostname-0.5.0.crate) = 8772 +SHA256 (rust/crates/getrandom-0.2.15.crate) = c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7 +SIZE (rust/crates/getrandom-0.2.15.crate) = 37163 +SHA256 (rust/crates/gif-0.13.1.crate) = 3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2 +SIZE (rust/crates/gif-0.13.1.crate) = 36408 +SHA256 (rust/crates/gimli-0.31.1.crate) = 07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f +SIZE (rust/crates/gimli-0.31.1.crate) = 279515 +SHA256 (rust/crates/gix-0.64.0.crate) = d78414d29fcc82329080166077e0f7689f4016551fdb334d787c3d040fe2634f +SIZE (rust/crates/gix-0.64.0.crate) = 273610 +SHA256 (rust/crates/gix-actor-0.31.5.crate) = a0e454357e34b833cc3a00b6efbbd3dd4d18b24b9fb0c023876ec2645e8aa3f2 +SIZE (rust/crates/gix-actor-0.31.5.crate) = 9335 +SHA256 (rust/crates/gix-chunk-0.4.10.crate) = c6ffbeb3a5c0b8b84c3fe4133a6f8c82fa962f4caefe8d0762eced025d3eb4f7 +SIZE (rust/crates/gix-chunk-0.4.10.crate) = 10131 +SHA256 (rust/crates/gix-commitgraph-0.24.3.crate) = 133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78 +SIZE (rust/crates/gix-commitgraph-0.24.3.crate) = 18242 +SHA256 (rust/crates/gix-config-0.38.0.crate) = 28f53fd03d1bf09ebcc2c8654f08969439c4556e644ca925f27cf033bc43e658 +SIZE (rust/crates/gix-config-0.38.0.crate) = 63374 +SHA256 (rust/crates/gix-config-value-0.14.10.crate) = 49aaeef5d98390a3bcf9dbc6440b520b793d1bf3ed99317dc407b02be995b28e +SIZE (rust/crates/gix-config-value-0.14.10.crate) = 13604 +SHA256 (rust/crates/gix-date-0.8.7.crate) = 9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0 +SIZE (rust/crates/gix-date-0.8.7.crate) = 10349 +SHA256 (rust/crates/gix-diff-0.44.1.crate) = 1996d5c8a305b59709467d80617c9fde48d9d75fd1f4179ea970912630886c9d +SIZE (rust/crates/gix-diff-0.44.1.crate) = 32197 +SHA256 (rust/crates/gix-discover-0.33.0.crate) = 67662731cec3cb31ba3ed2463809493f76d8e5d6c6d245de8b0560438c13450e +SIZE (rust/crates/gix-discover-0.33.0.crate) = 16632 +SHA256 (rust/crates/gix-features-0.38.2.crate) = ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69 +SIZE (rust/crates/gix-features-0.38.2.crate) = 30604 +SHA256 (rust/crates/gix-fs-0.11.3.crate) = f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575 +SIZE (rust/crates/gix-fs-0.11.3.crate) = 14867 +SHA256 (rust/crates/gix-glob-0.16.5.crate) = 74908b4bbc0a0a40852737e5d7889f676f081e340d5451a16e5b4c50d592f111 +SIZE (rust/crates/gix-glob-0.16.5.crate) = 13425 +SHA256 (rust/crates/gix-hash-0.14.2.crate) = f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e +SIZE (rust/crates/gix-hash-0.14.2.crate) = 12759 +SHA256 (rust/crates/gix-hashtable-0.5.2.crate) = 7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242 +SIZE (rust/crates/gix-hashtable-0.5.2.crate) = 6421 +SHA256 (rust/crates/gix-lock-14.0.0.crate) = e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d +SIZE (rust/crates/gix-lock-14.0.0.crate) = 9795 +SHA256 (rust/crates/gix-macros-0.1.5.crate) = 999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17 +SIZE (rust/crates/gix-macros-0.1.5.crate) = 8627 +SHA256 (rust/crates/gix-object-0.42.3.crate) = 25da2f46b4e7c2fa7b413ce4dffb87f69eaf89c2057e386491f4c55cadbfe386 +SIZE (rust/crates/gix-object-0.42.3.crate) = 32497 +SHA256 (rust/crates/gix-odb-0.61.1.crate) = 20d384fe541d93d8a3bb7d5d5ef210780d6df4f50c4e684ccba32665a5e3bc9b +SIZE (rust/crates/gix-odb-0.61.1.crate) = 54308 +SHA256 (rust/crates/gix-pack-0.51.1.crate) = 3e0594491fffe55df94ba1c111a6566b7f56b3f8d2e1efc750e77d572f5f5229 +SIZE (rust/crates/gix-pack-0.51.1.crate) = 96737 +SHA256 (rust/crates/gix-path-0.10.13.crate) = afc292ef1a51e340aeb0e720800338c805975724c1dfbd243185452efd8645b7 +SIZE (rust/crates/gix-path-0.10.13.crate) = 22831 +SHA256 (rust/crates/gix-quote-0.4.14.crate) = 64a1e282216ec2ab2816cd57e6ed88f8009e634aec47562883c05ac8a7009a63 +SIZE (rust/crates/gix-quote-0.4.14.crate) = 7828 +SHA256 (rust/crates/gix-ref-0.45.0.crate) = 636e96a0a5562715153fee098c217110c33a6f8218f08f4687ff99afde159bb5 +SIZE (rust/crates/gix-ref-0.45.0.crate) = 56670 +SHA256 (rust/crates/gix-refspec-0.23.1.crate) = 6868f8cd2e62555d1f7c78b784bece43ace40dd2a462daf3b588d5416e603f37 +SIZE (rust/crates/gix-refspec-0.23.1.crate) = 16175 +SHA256 (rust/crates/gix-revision-0.27.2.crate) = 01b13e43c2118c4b0537ddac7d0821ae0dfa90b7b8dbf20c711e153fb749adce +SIZE (rust/crates/gix-revision-0.27.2.crate) = 19204 +SHA256 (rust/crates/gix-revwalk-0.13.2.crate) = 1b030ccaab71af141f537e0225f19b9e74f25fefdba0372246b844491cab43e0 +SIZE (rust/crates/gix-revwalk-0.13.2.crate) = 11854 +SHA256 (rust/crates/gix-sec-0.10.10.crate) = a8b876ef997a955397809a2ec398d6a45b7a55b4918f2446344330f778d14fd6 +SIZE (rust/crates/gix-sec-0.10.10.crate) = 10205 +SHA256 (rust/crates/gix-tempfile-14.0.2.crate) = 046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa +SIZE (rust/crates/gix-tempfile-14.0.2.crate) = 17489 +SHA256 (rust/crates/gix-trace-0.1.11.crate) = 04bdde120c29f1fc23a24d3e115aeeea3d60d8e65bab92cc5f9d90d9302eb952 +SIZE (rust/crates/gix-trace-0.1.11.crate) = 10424 +SHA256 (rust/crates/gix-traverse-0.39.2.crate) = e499a18c511e71cf4a20413b743b9f5bcf64b3d9e81e9c3c6cd399eae55a8840 +SIZE (rust/crates/gix-traverse-0.39.2.crate) = 17291 +SHA256 (rust/crates/gix-url-0.27.5.crate) = fd280c5e84fb22e128ed2a053a0daeacb6379469be6a85e3d518a0636e160c89 +SIZE (rust/crates/gix-url-0.27.5.crate) = 14367 +SHA256 (rust/crates/gix-utils-0.1.13.crate) = ba427e3e9599508ed98a6ddf8ed05493db114564e338e41f6a996d2e4790335f +SIZE (rust/crates/gix-utils-0.1.13.crate) = 10194 +SHA256 (rust/crates/gix-validate-0.8.5.crate) = 82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf +SIZE (rust/crates/gix-validate-0.8.5.crate) = 10408 +SHA256 (rust/crates/glob-0.3.1.crate) = d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b +SIZE (rust/crates/glob-0.3.1.crate) = 18880 +SHA256 (rust/crates/h2-0.3.26.crate) = 81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8 +SIZE (rust/crates/h2-0.3.26.crate) = 168315 +SHA256 (rust/crates/h2-0.4.7.crate) = ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e +SIZE (rust/crates/h2-0.4.7.crate) = 174114 +SHA256 (rust/crates/half-1.8.3.crate) = 1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403 +SIZE (rust/crates/half-1.8.3.crate) = 41624 +SHA256 (rust/crates/hashbrown-0.12.3.crate) = 8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888 +SIZE (rust/crates/hashbrown-0.12.3.crate) = 102968 +SHA256 (rust/crates/hashbrown-0.14.5.crate) = e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1 +SIZE (rust/crates/hashbrown-0.14.5.crate) = 141498 +SHA256 (rust/crates/hashbrown-0.15.2.crate) = bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289 +SIZE (rust/crates/hashbrown-0.15.2.crate) = 138478 +SHA256 (rust/crates/hashlink-0.8.4.crate) = e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7 +SIZE (rust/crates/hashlink-0.8.4.crate) = 26514 +SHA256 (rust/crates/heck-0.5.0.crate) = 2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea +SIZE (rust/crates/heck-0.5.0.crate) = 11517 +SHA256 (rust/crates/hex-0.4.3.crate) = 7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70 +SIZE (rust/crates/hex-0.4.3.crate) = 13299 +SHA256 (rust/crates/home-0.5.11.crate) = 589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf +SIZE (rust/crates/home-0.5.11.crate) = 9926 +SHA256 (rust/crates/hostname-validator-1.1.1.crate) = f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2 +SIZE (rust/crates/hostname-validator-1.1.1.crate) = 2377 +SHA256 (rust/crates/http-0.2.12.crate) = 601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1 +SIZE (rust/crates/http-0.2.12.crate) = 101964 +SHA256 (rust/crates/http-1.2.0.crate) = f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea +SIZE (rust/crates/http-1.2.0.crate) = 105932 +SHA256 (rust/crates/http-body-0.4.6.crate) = 7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2 +SIZE (rust/crates/http-body-0.4.6.crate) = 10773 +SHA256 (rust/crates/http-body-1.0.1.crate) = 1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184 +SIZE (rust/crates/http-body-1.0.1.crate) = 6125 +SHA256 (rust/crates/http-body-util-0.1.2.crate) = 793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f +SIZE (rust/crates/http-body-util-0.1.2.crate) = 12821 +SHA256 (rust/crates/http-range-header-0.4.2.crate) = 9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c +SIZE (rust/crates/http-range-header-0.4.2.crate) = 8545 +SHA256 (rust/crates/httparse-1.9.5.crate) = 7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946 +SIZE (rust/crates/httparse-1.9.5.crate) = 39029 +SHA256 (rust/crates/httpdate-1.0.3.crate) = df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9 +SIZE (rust/crates/httpdate-1.0.3.crate) = 10639 +SHA256 (rust/crates/humansize-2.1.3.crate) = 6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7 +SIZE (rust/crates/humansize-2.1.3.crate) = 11953 +SHA256 (rust/crates/hyper-0.14.32.crate) = 41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7 +SIZE (rust/crates/hyper-0.14.32.crate) = 199622 +SHA256 (rust/crates/hyper-1.5.2.crate) = 256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0 +SIZE (rust/crates/hyper-1.5.2.crate) = 152817 +SHA256 (rust/crates/hyper-rustls-0.24.2.crate) = ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590 +SIZE (rust/crates/hyper-rustls-0.24.2.crate) = 30195 +SHA256 (rust/crates/hyper-rustls-0.27.5.crate) = 2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2 +SIZE (rust/crates/hyper-rustls-0.27.5.crate) = 34660 +SHA256 (rust/crates/hyper-timeout-0.4.1.crate) = bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1 +SIZE (rust/crates/hyper-timeout-0.4.1.crate) = 13805 +SHA256 (rust/crates/hyper-tls-0.6.0.crate) = 70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0 +SIZE (rust/crates/hyper-tls-0.6.0.crate) = 15052 +SHA256 (rust/crates/hyper-util-0.1.10.crate) = df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4 +SIZE (rust/crates/hyper-util-0.1.10.crate) = 72887 +SHA256 (rust/crates/iana-time-zone-0.1.61.crate) = 235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220 +SIZE (rust/crates/iana-time-zone-0.1.61.crate) = 27685 +SHA256 (rust/crates/iana-time-zone-haiku-0.1.2.crate) = f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f +SIZE (rust/crates/iana-time-zone-haiku-0.1.2.crate) = 7185 +SHA256 (rust/crates/icu_collections-1.5.0.crate) = db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526 +SIZE (rust/crates/icu_collections-1.5.0.crate) = 82762 +SHA256 (rust/crates/icu_locid-1.5.0.crate) = 13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637 +SIZE (rust/crates/icu_locid-1.5.0.crate) = 55131 +SHA256 (rust/crates/icu_locid_transform-1.5.0.crate) = 01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e +SIZE (rust/crates/icu_locid_transform-1.5.0.crate) = 29094 +SHA256 (rust/crates/icu_locid_transform_data-1.5.0.crate) = fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e +SIZE (rust/crates/icu_locid_transform_data-1.5.0.crate) = 44727 +SHA256 (rust/crates/icu_normalizer-1.5.0.crate) = 19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f +SIZE (rust/crates/icu_normalizer-1.5.0.crate) = 53113 +SHA256 (rust/crates/icu_normalizer_data-1.5.0.crate) = f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516 +SIZE (rust/crates/icu_normalizer_data-1.5.0.crate) = 50561 +SHA256 (rust/crates/icu_properties-1.5.1.crate) = 93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5 +SIZE (rust/crates/icu_properties-1.5.1.crate) = 64479 +SHA256 (rust/crates/icu_properties_data-1.5.0.crate) = 67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569 +SIZE (rust/crates/icu_properties_data-1.5.0.crate) = 227993 +SHA256 (rust/crates/icu_provider-1.5.0.crate) = 6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9 +SIZE (rust/crates/icu_provider-1.5.0.crate) = 52722 +SHA256 (rust/crates/icu_provider_macros-1.5.0.crate) = 1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6 +SIZE (rust/crates/icu_provider_macros-1.5.0.crate) = 6436 +SHA256 (rust/crates/ident_case-1.0.1.crate) = b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39 +SIZE (rust/crates/ident_case-1.0.1.crate) = 3492 +SHA256 (rust/crates/idlset-0.2.5.crate) = ef858150272c6cce9db3710a171edf5d3e8844d38680d7657e9b1698efe8d97b +SIZE (rust/crates/idlset-0.2.5.crate) = 106725 +SHA256 (rust/crates/idna-1.0.3.crate) = 686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e +SIZE (rust/crates/idna-1.0.3.crate) = 142515 +SHA256 (rust/crates/idna_adapter-1.2.0.crate) = daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71 +SIZE (rust/crates/idna_adapter-1.2.0.crate) = 8206 +SHA256 (rust/crates/image-0.23.14.crate) = 24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1 +SIZE (rust/crates/image-0.23.14.crate) = 226804 +SHA256 (rust/crates/image-0.24.9.crate) = 5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d +SIZE (rust/crates/image-0.24.9.crate) = 9261055 +SHA256 (rust/crates/indexmap-1.9.3.crate) = bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99 +SIZE (rust/crates/indexmap-1.9.3.crate) = 54653 +SHA256 (rust/crates/indexmap-2.7.0.crate) = 62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f +SIZE (rust/crates/indexmap-2.7.0.crate) = 85335 +SHA256 (rust/crates/inotify-0.9.6.crate) = f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff +SIZE (rust/crates/inotify-0.9.6.crate) = 22971 +SHA256 (rust/crates/inotify-sys-0.1.5.crate) = e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb +SIZE (rust/crates/inotify-sys-0.1.5.crate) = 6965 +SHA256 (rust/crates/ipnet-2.10.1.crate) = ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708 +SIZE (rust/crates/ipnet-2.10.1.crate) = 28407 +SHA256 (rust/crates/is_terminal_polyfill-1.70.1.crate) = 7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf +SIZE (rust/crates/is_terminal_polyfill-1.70.1.crate) = 7492 +SHA256 (rust/crates/itertools-0.10.5.crate) = b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473 +SIZE (rust/crates/itertools-0.10.5.crate) = 115354 +SHA256 (rust/crates/itertools-0.13.0.crate) = 413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186 +SIZE (rust/crates/itertools-0.13.0.crate) = 146261 +SHA256 (rust/crates/itoa-1.0.14.crate) = d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674 +SIZE (rust/crates/itoa-1.0.14.crate) = 11210 +SHA256 (rust/crates/jpeg-decoder-0.3.1.crate) = f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0 +SIZE (rust/crates/jpeg-decoder-0.3.1.crate) = 744364 +SHA256 (rust/crates/js-sys-0.3.76.crate) = 6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7 +SIZE (rust/crates/js-sys-0.3.76.crate) = 54420 +SHA256 (rust/crates/jsonschema-0.28.0.crate) = 74d8eb539cdb4222da29bb658cc9881aa2477b33fb1a74c5c31450395fc1a4b2 +SIZE (rust/crates/jsonschema-0.28.0.crate) = 99139 +SHA256 (rust/crates/kanidm-hsm-crypto-0.2.0.crate) = 10b3ed8e86cda3da4f274c677a3057d567bd7b715a0feb06a656e55cc75faf5e +SIZE (rust/crates/kanidm-hsm-crypto-0.2.0.crate) = 29700 +SHA256 (rust/crates/kqueue-1.0.8.crate) = 7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c +SIZE (rust/crates/kqueue-1.0.8.crate) = 12642 +SHA256 (rust/crates/kqueue-sys-1.0.4.crate) = ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b +SIZE (rust/crates/kqueue-sys-1.0.4.crate) = 7160 +SHA256 (rust/crates/lazy_static-1.5.0.crate) = bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe +SIZE (rust/crates/lazy_static-1.5.0.crate) = 14025 +SHA256 (rust/crates/lazycell-1.3.0.crate) = 830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55 +SIZE (rust/crates/lazycell-1.3.0.crate) = 12502 +SHA256 (rust/crates/lber-0.4.2.crate) = 2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a +SIZE (rust/crates/lber-0.4.2.crate) = 8107 +SHA256 (rust/crates/ldap3_client-0.5.2.crate) = c6027fc899bda353fe645cdcab9de93b0d2fa4731c105ad449fed22c455b61ff +SIZE (rust/crates/ldap3_client-0.5.2.crate) = 7678 +SHA256 (rust/crates/ldap3_proto-0.5.2.crate) = e9a047c1b49d3b4da70f52ac54310dcd879c9b7fef658615ff17f6212ae7411e +SIZE (rust/crates/ldap3_proto-0.5.2.crate) = 43605 +SHA256 (rust/crates/libc-0.2.169.crate) = b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a +SIZE (rust/crates/libc-0.2.169.crate) = 757901 +SHA256 (rust/crates/libloading-0.8.6.crate) = fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34 +SIZE (rust/crates/libloading-0.8.6.crate) = 28922 +SHA256 (rust/crates/libm-0.2.11.crate) = 8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa +SIZE (rust/crates/libm-0.2.11.crate) = 111477 +SHA256 (rust/crates/libmimalloc-sys-0.1.39.crate) = 23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44 +SIZE (rust/crates/libmimalloc-sys-0.1.39.crate) = 198523 +SHA256 (rust/crates/libnss-0.8.0.crate) = 3c4bc0291fc787d67c56e9ed79b80780e53bfb9be173177f301ee666cec1021b +SIZE (rust/crates/libnss-0.8.0.crate) = 7015 +SHA256 (rust/crates/libredox-0.1.3.crate) = c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d +SIZE (rust/crates/libredox-0.1.3.crate) = 6068 +SHA256 (rust/crates/libsqlite3-sys-0.25.2.crate) = 29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa +SIZE (rust/crates/libsqlite3-sys-0.25.2.crate) = 4841525 +SHA256 (rust/crates/libudev-0.2.0.crate) = ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe +SIZE (rust/crates/libudev-0.2.0.crate) = 8833 +SHA256 (rust/crates/libudev-sys-0.1.4.crate) = 3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324 +SIZE (rust/crates/libudev-sys-0.1.4.crate) = 6177 +SHA256 (rust/crates/linux-raw-sys-0.4.14.crate) = 78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89 +SIZE (rust/crates/linux-raw-sys-0.4.14.crate) = 1826665 +SHA256 (rust/crates/litemap-0.7.4.crate) = 4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104 +SIZE (rust/crates/litemap-0.7.4.crate) = 28257 +SHA256 (rust/crates/litrs-0.4.1.crate) = b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5 +SIZE (rust/crates/litrs-0.4.1.crate) = 42603 +SHA256 (rust/crates/lock_api-0.4.12.crate) = 07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17 +SIZE (rust/crates/lock_api-0.4.12.crate) = 27591 +SHA256 (rust/crates/lodepng-3.10.7.crate) = 7b2dea7cda68e381418c985fd8f32a9c279a21ae8c715f2376adb20c27a0fad3 +SIZE (rust/crates/lodepng-3.10.7.crate) = 52706 +SHA256 (rust/crates/log-0.4.22.crate) = a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24 +SIZE (rust/crates/log-0.4.22.crate) = 44027 +SHA256 (rust/crates/lru-0.12.5.crate) = 234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38 +SIZE (rust/crates/lru-0.12.5.crate) = 16047 +SHA256 (rust/crates/malloced-1.3.1.crate) = 6dfebb2f9e0b39509c62eead6ec7ae0c0ed45bb61d12bbcf4e976c566c5400ec +SIZE (rust/crates/malloced-1.3.1.crate) = 12129 +SHA256 (rust/crates/matchers-0.1.0.crate) = 8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558 +SIZE (rust/crates/matchers-0.1.0.crate) = 6948 +SHA256 (rust/crates/matchit-0.7.3.crate) = 0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94 +SIZE (rust/crates/matchit-0.7.3.crate) = 30372 +SHA256 (rust/crates/mathru-0.13.0.crate) = 9a42bf938e4c9a6ad581cf528d5606eb50c5458ac759ca23719291e2f6499bec +SIZE (rust/crates/mathru-0.13.0.crate) = 494915 +SHA256 (rust/crates/memchr-2.7.4.crate) = 78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3 +SIZE (rust/crates/memchr-2.7.4.crate) = 96670 +SHA256 (rust/crates/memmap2-0.9.5.crate) = fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f +SIZE (rust/crates/memmap2-0.9.5.crate) = 33280 +SHA256 (rust/crates/memoffset-0.8.0.crate) = d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1 +SIZE (rust/crates/memoffset-0.8.0.crate) = 8912 +SHA256 (rust/crates/mimalloc-0.1.43.crate) = 68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633 +SIZE (rust/crates/mimalloc-0.1.43.crate) = 4075 +SHA256 (rust/crates/mime-0.3.17.crate) = 6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a +SIZE (rust/crates/mime-0.3.17.crate) = 15712 +SHA256 (rust/crates/mime_guess-2.0.5.crate) = f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e +SIZE (rust/crates/mime_guess-2.0.5.crate) = 27166 +SHA256 (rust/crates/minimal-lexical-0.2.1.crate) = 68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a +SIZE (rust/crates/minimal-lexical-0.2.1.crate) = 94841 +SHA256 (rust/crates/miniz_oxide-0.8.2.crate) = 4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394 +SIZE (rust/crates/miniz_oxide-0.8.2.crate) = 59068 +SHA256 (rust/crates/mintex-0.1.3.crate) = 9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07 +SIZE (rust/crates/mintex-0.1.3.crate) = 6769 +SHA256 (rust/crates/mio-0.8.11.crate) = a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c +SIZE (rust/crates/mio-0.8.11.crate) = 102983 +SHA256 (rust/crates/mio-1.0.3.crate) = 2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd +SIZE (rust/crates/mio-1.0.3.crate) = 103703 +SHA256 (rust/crates/multer-3.1.0.crate) = 83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b +SIZE (rust/crates/multer-3.1.0.crate) = 25980 +SHA256 (rust/crates/native-tls-0.2.12.crate) = a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466 +SIZE (rust/crates/native-tls-0.2.12.crate) = 29517 +SHA256 (rust/crates/nix-0.29.0.crate) = 71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46 +SIZE (rust/crates/nix-0.29.0.crate) = 318248 +SHA256 (rust/crates/nom-7.1.3.crate) = d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a +SIZE (rust/crates/nom-7.1.3.crate) = 117570 +SHA256 (rust/crates/nonempty-0.8.1.crate) = aeaf4ad7403de93e699c191202f017118df734d3850b01e13a3a8b2e6953d3c9 +SIZE (rust/crates/nonempty-0.8.1.crate) = 9782 +SHA256 (rust/crates/notify-6.1.1.crate) = 6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d +SIZE (rust/crates/notify-6.1.1.crate) = 40117 +SHA256 (rust/crates/notify-debouncer-full-0.1.0.crate) = f4812c1eb49be776fb8df4961623bdc01ec9dfdc1abe8211ceb09150a2e64219 +SIZE (rust/crates/notify-debouncer-full-0.1.0.crate) = 13595 +SHA256 (rust/crates/nu-ansi-term-0.46.0.crate) = 77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84 +SIZE (rust/crates/nu-ansi-term-0.46.0.crate) = 24311 +SHA256 (rust/crates/num-0.4.3.crate) = 35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23 +SIZE (rust/crates/num-0.4.3.crate) = 9575 +SHA256 (rust/crates/num-bigint-0.4.6.crate) = a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9 +SIZE (rust/crates/num-bigint-0.4.6.crate) = 102801 +SHA256 (rust/crates/num-cmp-0.1.0.crate) = 63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa +SIZE (rust/crates/num-cmp-0.1.0.crate) = 15375 +SHA256 (rust/crates/num-complex-0.4.6.crate) = 73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495 +SIZE (rust/crates/num-complex-0.4.6.crate) = 30352 +SHA256 (rust/crates/num-conv-0.1.0.crate) = 51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9 +SIZE (rust/crates/num-conv-0.1.0.crate) = 7444 +SHA256 (rust/crates/num-derive-0.3.3.crate) = 876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d +SIZE (rust/crates/num-derive-0.3.3.crate) = 14545 +SHA256 (rust/crates/num-integer-0.1.46.crate) = 7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f +SIZE (rust/crates/num-integer-0.1.46.crate) = 22331 +SHA256 (rust/crates/num-iter-0.1.45.crate) = 1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf +SIZE (rust/crates/num-iter-0.1.45.crate) = 10320 +SHA256 (rust/crates/num-rational-0.3.2.crate) = 12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07 +SIZE (rust/crates/num-rational-0.3.2.crate) = 26359 +SHA256 (rust/crates/num-rational-0.4.2.crate) = f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824 +SIZE (rust/crates/num-rational-0.4.2.crate) = 28159 +SHA256 (rust/crates/num-traits-0.2.19.crate) = 071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841 +SIZE (rust/crates/num-traits-0.2.19.crate) = 51631 +SHA256 (rust/crates/num_enum-0.5.11.crate) = 1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9 +SIZE (rust/crates/num_enum-0.5.11.crate) = 16772 +SHA256 (rust/crates/num_enum_derive-0.5.11.crate) = dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799 +SIZE (rust/crates/num_enum_derive-0.5.11.crate) = 15552 +SHA256 (rust/crates/num_threads-0.1.7.crate) = 5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9 +SIZE (rust/crates/num_threads-0.1.7.crate) = 7455 +SHA256 (rust/crates/oauth2-4.4.2.crate) = c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f +SIZE (rust/crates/oauth2-4.4.2.crate) = 74489 +SHA256 (rust/crates/object-0.36.5.crate) = aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e +SIZE (rust/crates/object-0.36.5.crate) = 327435 +SHA256 (rust/crates/oid-0.2.1.crate) = 9c19903c598813dba001b53beeae59bb77ad4892c5c1b9b3500ce4293a0d06c2 +SIZE (rust/crates/oid-0.2.1.crate) = 12533 +SHA256 (rust/crates/oid-registry-0.7.1.crate) = a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9 +SIZE (rust/crates/oid-registry-0.7.1.crate) = 15220 +SHA256 (rust/crates/once_cell-1.20.2.crate) = 1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775 +SIZE (rust/crates/once_cell-1.20.2.crate) = 33394 +SHA256 (rust/crates/openssl-0.10.68.crate) = 6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5 +SIZE (rust/crates/openssl-0.10.68.crate) = 276578 +SHA256 (rust/crates/openssl-macros-0.1.1.crate) = a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c +SIZE (rust/crates/openssl-macros-0.1.1.crate) = 5601 +SHA256 (rust/crates/openssl-probe-0.1.5.crate) = ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf +SIZE (rust/crates/openssl-probe-0.1.5.crate) = 7227 +SHA256 (rust/crates/openssl-sys-0.9.104.crate) = 45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741 +SIZE (rust/crates/openssl-sys-0.9.104.crate) = 72287 +SHA256 (rust/crates/opentelemetry-0.20.0.crate) = 9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54 +SIZE (rust/crates/opentelemetry-0.20.0.crate) = 15313 +SHA256 (rust/crates/opentelemetry-http-0.9.0.crate) = c7594ec0e11d8e33faf03530a4c49af7064ebba81c1480e01be67d90b356508b +SIZE (rust/crates/opentelemetry-http-0.9.0.crate) = 8772 +SHA256 (rust/crates/opentelemetry-otlp-0.13.0.crate) = 7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275 +SIZE (rust/crates/opentelemetry-otlp-0.13.0.crate) = 30421 +SHA256 (rust/crates/opentelemetry-proto-0.3.0.crate) = b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb +SIZE (rust/crates/opentelemetry-proto-0.3.0.crate) = 182707 +SHA256 (rust/crates/opentelemetry-semantic-conventions-0.12.0.crate) = 73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269 +SIZE (rust/crates/opentelemetry-semantic-conventions-0.12.0.crate) = 32096 +SHA256 (rust/crates/opentelemetry_api-0.20.0.crate) = 8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b +SIZE (rust/crates/opentelemetry_api-0.20.0.crate) = 60100 +SHA256 (rust/crates/opentelemetry_sdk-0.20.0.crate) = fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026 +SIZE (rust/crates/opentelemetry_sdk-0.20.0.crate) = 103022 +SHA256 (rust/crates/ordered-float-3.9.2.crate) = f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc +SIZE (rust/crates/ordered-float-3.9.2.crate) = 19788 +SHA256 (rust/crates/outref-0.5.1.crate) = 4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a +SIZE (rust/crates/outref-0.5.1.crate) = 3957 +SHA256 (rust/crates/overload-0.1.1.crate) = b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39 +SIZE (rust/crates/overload-0.1.1.crate) = 24439 +SHA256 (rust/crates/parking_lot-0.12.3.crate) = f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27 +SIZE (rust/crates/parking_lot-0.12.3.crate) = 41860 +SHA256 (rust/crates/parking_lot_core-0.9.10.crate) = 1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8 +SIZE (rust/crates/parking_lot_core-0.9.10.crate) = 32406 +SHA256 (rust/crates/password-hash-0.5.0.crate) = 346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166 +SIZE (rust/crates/password-hash-0.5.0.crate) = 26884 +SHA256 (rust/crates/paste-1.0.15.crate) = 57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a +SIZE (rust/crates/paste-1.0.15.crate) = 18374 +SHA256 (rust/crates/peeking_take_while-0.1.2.crate) = 19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099 +SIZE (rust/crates/peeking_take_while-0.1.2.crate) = 6697 +SHA256 (rust/crates/peg-0.8.4.crate) = 295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f +SIZE (rust/crates/peg-0.8.4.crate) = 19291 +SHA256 (rust/crates/peg-macros-0.8.4.crate) = bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426 +SIZE (rust/crates/peg-macros-0.8.4.crate) = 29722 +SHA256 (rust/crates/peg-runtime-0.8.3.crate) = e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a +SIZE (rust/crates/peg-runtime-0.8.3.crate) = 4159 +SHA256 (rust/crates/pem-rfc7468-0.7.0.crate) = 88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412 +SIZE (rust/crates/pem-rfc7468-0.7.0.crate) = 24159 +SHA256 (rust/crates/percent-encoding-2.3.1.crate) = e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e +SIZE (rust/crates/percent-encoding-2.3.1.crate) = 10235 +SHA256 (rust/crates/petgraph-0.6.5.crate) = b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db +SIZE (rust/crates/petgraph-0.6.5.crate) = 710970 +SHA256 (rust/crates/picky-asn1-0.8.0.crate) = 295eea0f33c16be21e2a98b908fdd4d73c04dd48c8480991b76dbcf0cb58b212 +SIZE (rust/crates/picky-asn1-0.8.0.crate) = 19901 +SHA256 (rust/crates/picky-asn1-der-0.4.1.crate) = 5df7873a9e36d42dadb393bea5e211fe83d793c172afad5fb4ec846ec582793f +SIZE (rust/crates/picky-asn1-der-0.4.1.crate) = 20924 +SHA256 (rust/crates/picky-asn1-x509-0.12.0.crate) = 2c5f20f71a68499ff32310f418a6fad8816eac1a2859ed3f0c5c741389dd6208 +SIZE (rust/crates/picky-asn1-x509-0.12.0.crate) = 98267 +SHA256 (rust/crates/pin-project-1.1.7.crate) = be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95 +SIZE (rust/crates/pin-project-1.1.7.crate) = 55438 +SHA256 (rust/crates/pin-project-internal-1.1.7.crate) = 3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c +SIZE (rust/crates/pin-project-internal-1.1.7.crate) = 28549 +SHA256 (rust/crates/pin-project-lite-0.2.15.crate) = 915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff +SIZE (rust/crates/pin-project-lite-0.2.15.crate) = 29683 +SHA256 (rust/crates/pin-utils-0.1.0.crate) = 8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184 +SIZE (rust/crates/pin-utils-0.1.0.crate) = 7580 +SHA256 (rust/crates/pkg-config-0.3.31.crate) = 953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2 +SIZE (rust/crates/pkg-config-0.3.31.crate) = 20880 +SHA256 (rust/crates/powerfmt-0.2.0.crate) = 439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391 +SIZE (rust/crates/powerfmt-0.2.0.crate) = 15165 +SHA256 (rust/crates/ppv-lite86-0.2.20.crate) = 77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04 +SIZE (rust/crates/ppv-lite86-0.2.20.crate) = 22478 +SHA256 (rust/crates/prctl-1.0.0.crate) = 059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52 +SIZE (rust/crates/prctl-1.0.0.crate) = 5084 +SHA256 (rust/crates/predicates-3.1.3.crate) = a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573 +SIZE (rust/crates/predicates-3.1.3.crate) = 24063 +SHA256 (rust/crates/predicates-core-1.0.9.crate) = 727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa +SIZE (rust/crates/predicates-core-1.0.9.crate) = 8618 +SHA256 (rust/crates/predicates-tree-1.0.12.crate) = 72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c +SIZE (rust/crates/predicates-tree-1.0.12.crate) = 8392 +SHA256 (rust/crates/prettyplease-0.2.25.crate) = 64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033 +SIZE (rust/crates/prettyplease-0.2.25.crate) = 58681 +SHA256 (rust/crates/proc-macro-crate-1.3.1.crate) = 7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919 +SIZE (rust/crates/proc-macro-crate-1.3.1.crate) = 9678 +SHA256 (rust/crates/proc-macro-error-1.0.4.crate) = da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c +SIZE (rust/crates/proc-macro-error-1.0.4.crate) = 25293 +SHA256 (rust/crates/proc-macro-error-attr-1.0.4.crate) = a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869 +SIZE (rust/crates/proc-macro-error-attr-1.0.4.crate) = 7971 +SHA256 (rust/crates/proc-macro2-1.0.92.crate) = 37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0 +SIZE (rust/crates/proc-macro2-1.0.92.crate) = 52353 +SHA256 (rust/crates/prodash-28.0.0.crate) = 744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79 +SIZE (rust/crates/prodash-28.0.0.crate) = 90695 +SHA256 (rust/crates/prost-0.11.9.crate) = 0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd +SIZE (rust/crates/prost-0.11.9.crate) = 28958 +SHA256 (rust/crates/prost-derive-0.11.9.crate) = e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4 +SIZE (rust/crates/prost-derive-0.11.9.crate) = 19513 +SHA256 (rust/crates/psl-types-2.0.11.crate) = 33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac +SIZE (rust/crates/psl-types-2.0.11.crate) = 7959 +SHA256 (rust/crates/publicsuffix-2.3.0.crate) = 6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf +SIZE (rust/crates/publicsuffix-2.3.0.crate) = 87890 +SHA256 (rust/crates/qrcode-0.12.0.crate) = 16d2f1455f3630c6e5107b4f2b94e74d76dea80736de0981fd27644216cff57f +SIZE (rust/crates/qrcode-0.12.0.crate) = 58072 +SHA256 (rust/crates/quick-error-2.0.1.crate) = a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3 +SIZE (rust/crates/quick-error-2.0.1.crate) = 14265 +SHA256 (rust/crates/quinn-0.11.6.crate) = 62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef +SIZE (rust/crates/quinn-0.11.6.crate) = 78222 +SHA256 (rust/crates/quinn-proto-0.11.9.crate) = a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d +SIZE (rust/crates/quinn-proto-0.11.9.crate) = 209286 +SHA256 (rust/crates/quinn-udp-0.5.9.crate) = 1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904 +SIZE (rust/crates/quinn-udp-0.5.9.crate) = 25342 +SHA256 (rust/crates/quote-1.0.38.crate) = 0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc +SIZE (rust/crates/quote-1.0.38.crate) = 31252 +SHA256 (rust/crates/rand-0.8.5.crate) = 34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404 +SIZE (rust/crates/rand-0.8.5.crate) = 87113 +SHA256 (rust/crates/rand_chacha-0.3.1.crate) = e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88 +SIZE (rust/crates/rand_chacha-0.3.1.crate) = 15251 +SHA256 (rust/crates/rand_core-0.6.4.crate) = ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c +SIZE (rust/crates/rand_core-0.6.4.crate) = 22666 +SHA256 (rust/crates/redox_syscall-0.5.8.crate) = 03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834 +SIZE (rust/crates/redox_syscall-0.5.8.crate) = 26319 +SHA256 (rust/crates/redox_users-0.4.6.crate) = ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43 +SIZE (rust/crates/redox_users-0.4.6.crate) = 15585 +SHA256 (rust/crates/ref-cast-1.0.23.crate) = ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931 +SIZE (rust/crates/ref-cast-1.0.23.crate) = 12795 +SHA256 (rust/crates/ref-cast-impl-1.0.23.crate) = bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6 +SIZE (rust/crates/ref-cast-impl-1.0.23.crate) = 9360 +SHA256 (rust/crates/reference-counted-singleton-0.1.5.crate) = 5daffa8f5ca827e146485577fa9dba9bd9c6921e06e954ab8f6408c10f753086 +SIZE (rust/crates/reference-counted-singleton-0.1.5.crate) = 6309 +SHA256 (rust/crates/referencing-0.28.0.crate) = 093a875008827c0ae15c746189966e162faa05bf347719d06302c548ac63630f +SIZE (rust/crates/referencing-0.28.0.crate) = 28820 +SHA256 (rust/crates/regex-1.11.1.crate) = b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191 +SIZE (rust/crates/regex-1.11.1.crate) = 254170 +SHA256 (rust/crates/regex-automata-0.1.10.crate) = 6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132 +SIZE (rust/crates/regex-automata-0.1.10.crate) = 114533 +SHA256 (rust/crates/regex-automata-0.4.9.crate) = 809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908 +SIZE (rust/crates/regex-automata-0.4.9.crate) = 618525 +SHA256 (rust/crates/regex-syntax-0.6.29.crate) = f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1 +SIZE (rust/crates/regex-syntax-0.6.29.crate) = 299752 +SHA256 (rust/crates/regex-syntax-0.8.5.crate) = 2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c +SIZE (rust/crates/regex-syntax-0.8.5.crate) = 357541 +SHA256 (rust/crates/reqwest-0.11.27.crate) = dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62 +SIZE (rust/crates/reqwest-0.11.27.crate) = 163155 +SHA256 (rust/crates/reqwest-0.12.11.crate) = 7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3 +SIZE (rust/crates/reqwest-0.12.11.crate) = 193279 +SHA256 (rust/crates/rgb-0.8.50.crate) = 57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a +SIZE (rust/crates/rgb-0.8.50.crate) = 21980 +SHA256 (rust/crates/ring-0.17.8.crate) = c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d +SIZE (rust/crates/ring-0.17.8.crate) = 4188554 +SHA256 (rust/crates/rpassword-5.0.1.crate) = ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb +SIZE (rust/crates/rpassword-5.0.1.crate) = 11109 +SHA256 (rust/crates/runloop-0.1.0.crate) = 5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd +SIZE (rust/crates/runloop-0.1.0.crate) = 8610 +SHA256 (rust/crates/rusqlite-0.28.0.crate) = 01e213bc3ecb39ac32e81e51ebe31fd888a940515173e3a18a35f8c6e896422a +SIZE (rust/crates/rusqlite-0.28.0.crate) = 137504 +SHA256 (rust/crates/rust-embed-8.5.0.crate) = fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0 +SIZE (rust/crates/rust-embed-8.5.0.crate) = 904054 +SHA256 (rust/crates/rust-embed-impl-8.5.0.crate) = 6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478 +SIZE (rust/crates/rust-embed-impl-8.5.0.crate) = 6004 +SHA256 (rust/crates/rust-embed-utils-8.5.0.crate) = 2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d +SIZE (rust/crates/rust-embed-utils-8.5.0.crate) = 3445 +SHA256 (rust/crates/rustc-demangle-0.1.24.crate) = 719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f +SIZE (rust/crates/rustc-demangle-0.1.24.crate) = 29047 +SHA256 (rust/crates/rustc-hash-1.1.0.crate) = 08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2 +SIZE (rust/crates/rustc-hash-1.1.0.crate) = 9331 +SHA256 (rust/crates/rustc-hash-2.1.0.crate) = c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497 +SIZE (rust/crates/rustc-hash-2.1.0.crate) = 13316 +SHA256 (rust/crates/rusticata-macros-4.1.0.crate) = faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632 +SIZE (rust/crates/rusticata-macros-4.1.0.crate) = 11746 +SHA256 (rust/crates/rustix-0.38.42.crate) = f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85 +SIZE (rust/crates/rustix-0.38.42.crate) = 378683 +SHA256 (rust/crates/rustls-0.21.12.crate) = 3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e +SIZE (rust/crates/rustls-0.21.12.crate) = 285674 +SHA256 (rust/crates/rustls-0.23.20.crate) = 5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b +SIZE (rust/crates/rustls-0.23.20.crate) = 335933 +SHA256 (rust/crates/rustls-native-certs-0.8.1.crate) = 7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3 +SIZE (rust/crates/rustls-native-certs-0.8.1.crate) = 31129 +SHA256 (rust/crates/rustls-pemfile-1.0.4.crate) = 1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c +SIZE (rust/crates/rustls-pemfile-1.0.4.crate) = 22092 +SHA256 (rust/crates/rustls-pemfile-2.2.0.crate) = dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50 +SIZE (rust/crates/rustls-pemfile-2.2.0.crate) = 25849 +SHA256 (rust/crates/rustls-pki-types-1.10.1.crate) = d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37 +SIZE (rust/crates/rustls-pki-types-1.10.1.crate) = 58944 +SHA256 (rust/crates/rustls-webpki-0.101.7.crate) = 8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765 +SIZE (rust/crates/rustls-webpki-0.101.7.crate) = 168808 +SHA256 (rust/crates/rustls-webpki-0.102.8.crate) = 64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9 +SIZE (rust/crates/rustls-webpki-0.102.8.crate) = 204327 +SHA256 (rust/crates/rustversion-1.0.18.crate) = 0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248 +SIZE (rust/crates/rustversion-1.0.18.crate) = 17794 +SHA256 (rust/crates/ryu-1.0.18.crate) = f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f +SIZE (rust/crates/ryu-1.0.18.crate) = 47713 +SHA256 (rust/crates/same-file-1.0.6.crate) = 93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502 +SIZE (rust/crates/same-file-1.0.6.crate) = 10183 +SHA256 (rust/crates/schannel-0.1.27.crate) = 1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d +SIZE (rust/crates/schannel-0.1.27.crate) = 42772 +SHA256 (rust/crates/scopeguard-1.2.0.crate) = 94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49 +SIZE (rust/crates/scopeguard-1.2.0.crate) = 11619 +SHA256 (rust/crates/sct-0.7.1.crate) = da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414 +SIZE (rust/crates/sct-0.7.1.crate) = 27501 +SHA256 (rust/crates/sd-notify-0.4.3.crate) = 1be20c5f7f393ee700f8b2f28ea35812e4e212f40774b550cd2a93ea91684451 +SIZE (rust/crates/sd-notify-0.4.3.crate) = 11900 +SHA256 (rust/crates/security-framework-2.11.1.crate) = 897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02 +SIZE (rust/crates/security-framework-2.11.1.crate) = 80188 +SHA256 (rust/crates/security-framework-3.1.0.crate) = 81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc +SIZE (rust/crates/security-framework-3.1.0.crate) = 85399 +SHA256 (rust/crates/security-framework-sys-2.13.0.crate) = 1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5 +SIZE (rust/crates/security-framework-sys-2.13.0.crate) = 20496 +SHA256 (rust/crates/selinux-0.4.6.crate) = 0139b2436c81305eb6bda33af151851f75bd62783817b25f44daa371119c30b5 +SIZE (rust/crates/selinux-0.4.6.crate) = 37249 +SHA256 (rust/crates/selinux-sys-0.6.13.crate) = e5e6e2b8e07a8ff45c90f8e3611bf10c4da7a28d73a26f9ede04f927da234f52 +SIZE (rust/crates/selinux-sys-0.6.13.crate) = 9067 +SHA256 (rust/crates/semver-1.0.24.crate) = 3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba +SIZE (rust/crates/semver-1.0.24.crate) = 31267 +SHA256 (rust/crates/serde-1.0.217.crate) = 02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70 +SIZE (rust/crates/serde-1.0.217.crate) = 79019 +SHA256 (rust/crates/serde_bytes-0.11.15.crate) = 387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a +SIZE (rust/crates/serde_bytes-0.11.15.crate) = 12191 +SHA256 (rust/crates/serde_cbor-0.11.2.crate) = 2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5 +SIZE (rust/crates/serde_cbor-0.11.2.crate) = 44570 +SHA256 (rust/crates/serde_cbor_2-0.12.0-dev.crate) = b46d75f449e01f1eddbe9b00f432d616fbbd899b809c837d0fbc380496a0dd55 +SIZE (rust/crates/serde_cbor_2-0.12.0-dev.crate) = 44766 +SHA256 (rust/crates/serde_derive-1.0.217.crate) = 5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0 +SIZE (rust/crates/serde_derive-1.0.217.crate) = 57749 +SHA256 (rust/crates/serde_json-1.0.134.crate) = d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d +SIZE (rust/crates/serde_json-1.0.134.crate) = 154351 +SHA256 (rust/crates/serde_path_to_error-0.1.16.crate) = af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6 +SIZE (rust/crates/serde_path_to_error-0.1.16.crate) = 16657 +SHA256 (rust/crates/serde_urlencoded-0.7.1.crate) = d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd +SIZE (rust/crates/serde_urlencoded-0.7.1.crate) = 12822 +SHA256 (rust/crates/serde_with-3.12.0.crate) = d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa +SIZE (rust/crates/serde_with-3.12.0.crate) = 148666 +SHA256 (rust/crates/serde_with_macros-3.12.0.crate) = 8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e +SIZE (rust/crates/serde_with_macros-3.12.0.crate) = 32089 +SHA256 (rust/crates/sha-crypt-0.5.0.crate) = 88e79009728d8311d42d754f2f319a975f9e38f156fd5e422d2451486c78b286 +SIZE (rust/crates/sha-crypt-0.5.0.crate) = 14603 +SHA256 (rust/crates/sha1_smol-1.0.1.crate) = bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d +SIZE (rust/crates/sha1_smol-1.0.1.crate) = 9809 +SHA256 (rust/crates/sha2-0.10.8.crate) = 793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8 +SIZE (rust/crates/sha2-0.10.8.crate) = 26357 +SHA256 (rust/crates/sharded-slab-0.1.7.crate) = f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6 +SIZE (rust/crates/sharded-slab-0.1.7.crate) = 58227 +SHA256 (rust/crates/shell-words-1.1.0.crate) = 24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde +SIZE (rust/crates/shell-words-1.1.0.crate) = 9871 +SHA256 (rust/crates/shellexpand-2.1.2.crate) = 7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4 +SIZE (rust/crates/shellexpand-2.1.2.crate) = 16884 +SHA256 (rust/crates/shlex-1.3.0.crate) = 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64 +SIZE (rust/crates/shlex-1.3.0.crate) = 18713 +SHA256 (rust/crates/signal-hook-registry-1.4.2.crate) = a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1 +SIZE (rust/crates/signal-hook-registry-1.4.2.crate) = 18064 +SHA256 (rust/crates/slab-0.4.9.crate) = 8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67 +SIZE (rust/crates/slab-0.4.9.crate) = 17108 +SHA256 (rust/crates/smallvec-1.13.2.crate) = 3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67 +SIZE (rust/crates/smallvec-1.13.2.crate) = 35216 +SHA256 (rust/crates/smartstring-1.0.1.crate) = 3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29 +SIZE (rust/crates/smartstring-1.0.1.crate) = 29555 +SHA256 (rust/crates/smolset-1.3.1.crate) = a8d372e8fe15dc5229e7d6c65f5810849385e79e24f9d9d64263e132879c7be0 +SIZE (rust/crates/smolset-1.3.1.crate) = 7321 +SHA256 (rust/crates/socket2-0.5.8.crate) = c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8 +SIZE (rust/crates/socket2-0.5.8.crate) = 56309 +SHA256 (rust/crates/spin-0.9.8.crate) = 6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67 +SIZE (rust/crates/spin-0.9.8.crate) = 38958 +SHA256 (rust/crates/spki-0.7.3.crate) = d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d +SIZE (rust/crates/spki-0.7.3.crate) = 16409 +SHA256 (rust/crates/sptr-0.3.2.crate) = 3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a +SIZE (rust/crates/sptr-0.3.2.crate) = 14598 +SHA256 (rust/crates/sshkey-attest-0.5.0.crate) = 34285eaade87ba166c4f17c0ae1e35d52659507db81888beae277e962b9e5a02 +SIZE (rust/crates/sshkey-attest-0.5.0.crate) = 10028 +SHA256 (rust/crates/sshkeys-0.3.3.crate) = 45287473d24bf7ad9ebad1aff097ad0424c16cd9430549170c3a67c5b05705bd +SIZE (rust/crates/sshkeys-0.3.3.crate) = 32125 +SHA256 (rust/crates/stable_deref_trait-1.2.0.crate) = a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3 +SIZE (rust/crates/stable_deref_trait-1.2.0.crate) = 8054 +SHA256 (rust/crates/static_assertions-1.1.0.crate) = a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f +SIZE (rust/crates/static_assertions-1.1.0.crate) = 18480 +SHA256 (rust/crates/strsim-0.10.0.crate) = 73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623 +SIZE (rust/crates/strsim-0.10.0.crate) = 11355 +SHA256 (rust/crates/strsim-0.11.1.crate) = 7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f +SIZE (rust/crates/strsim-0.11.1.crate) = 14266 +SHA256 (rust/crates/subtle-2.6.1.crate) = 13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292 +SIZE (rust/crates/subtle-2.6.1.crate) = 14562 +SHA256 (rust/crates/svg-0.13.1.crate) = 02d815ad337e8449d2374d4248448645edfe74e699343dd5719139d93fa87112 +SIZE (rust/crates/svg-0.13.1.crate) = 17320 +SHA256 (rust/crates/syn-1.0.109.crate) = 72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237 +SIZE (rust/crates/syn-1.0.109.crate) = 237611 +SHA256 (rust/crates/syn-2.0.93.crate) = 9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058 +SIZE (rust/crates/syn-2.0.93.crate) = 293925 +SHA256 (rust/crates/sync_wrapper-0.1.2.crate) = 2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160 +SIZE (rust/crates/sync_wrapper-0.1.2.crate) = 6933 +SHA256 (rust/crates/sync_wrapper-1.0.2.crate) = 0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263 +SIZE (rust/crates/sync_wrapper-1.0.2.crate) = 6958 +SHA256 (rust/crates/synstructure-0.13.1.crate) = c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971 +SIZE (rust/crates/synstructure-0.13.1.crate) = 18327 +SHA256 (rust/crates/system-configuration-0.5.1.crate) = ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7 +SIZE (rust/crates/system-configuration-0.5.1.crate) = 12618 +SHA256 (rust/crates/system-configuration-sys-0.5.0.crate) = a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9 +SIZE (rust/crates/system-configuration-sys-0.5.0.crate) = 6730 +SHA256 (rust/crates/target-lexicon-0.12.16.crate) = 61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1 +SIZE (rust/crates/target-lexicon-0.12.16.crate) = 26488 +SHA256 (rust/crates/tempfile-3.14.0.crate) = 28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c +SIZE (rust/crates/tempfile-3.14.0.crate) = 35065 +SHA256 (rust/crates/termtree-0.5.1.crate) = 8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683 +SIZE (rust/crates/termtree-0.5.1.crate) = 8498 +SHA256 (rust/crates/thiserror-1.0.69.crate) = b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52 +SIZE (rust/crates/thiserror-1.0.69.crate) = 22198 +SHA256 (rust/crates/thiserror-2.0.8.crate) = 08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a +SIZE (rust/crates/thiserror-2.0.8.crate) = 28536 +SHA256 (rust/crates/thiserror-impl-1.0.69.crate) = 4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1 +SIZE (rust/crates/thiserror-impl-1.0.69.crate) = 18365 +SHA256 (rust/crates/thiserror-impl-2.0.8.crate) = f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943 +SIZE (rust/crates/thiserror-impl-2.0.8.crate) = 21014 +SHA256 (rust/crates/thousands-0.2.0.crate) = 3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820 +SIZE (rust/crates/thousands-0.2.0.crate) = 11060 +SHA256 (rust/crates/thread_local-1.1.8.crate) = 8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c +SIZE (rust/crates/thread_local-1.1.8.crate) = 13962 +SHA256 (rust/crates/time-0.3.37.crate) = 35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21 +SIZE (rust/crates/time-0.3.37.crate) = 123257 +SHA256 (rust/crates/time-core-0.1.2.crate) = ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3 +SIZE (rust/crates/time-core-0.1.2.crate) = 7191 +SHA256 (rust/crates/time-macros-0.2.19.crate) = 2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de +SIZE (rust/crates/time-macros-0.2.19.crate) = 24268 +SHA256 (rust/crates/tinystr-0.7.6.crate) = 9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f +SIZE (rust/crates/tinystr-0.7.6.crate) = 16971 +SHA256 (rust/crates/tinyvec-1.8.1.crate) = 022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8 +SIZE (rust/crates/tinyvec-1.8.1.crate) = 47269 +SHA256 (rust/crates/tinyvec_macros-0.1.1.crate) = 1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20 +SIZE (rust/crates/tinyvec_macros-0.1.1.crate) = 5865 +SHA256 (rust/crates/tls_codec-0.4.1.crate) = b5e78c9c330f8c85b2bae7c8368f2739157db9991235123aa1b15ef9502bfb6a +SIZE (rust/crates/tls_codec-0.4.1.crate) = 23077 +SHA256 (rust/crates/tls_codec_derive-0.4.1.crate) = 8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c +SIZE (rust/crates/tls_codec_derive-0.4.1.crate) = 18463 +SHA256 (rust/crates/tokio-1.42.0.crate) = 5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551 +SIZE (rust/crates/tokio-1.42.0.crate) = 806998 +SHA256 (rust/crates/tokio-io-timeout-1.2.0.crate) = 30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf +SIZE (rust/crates/tokio-io-timeout-1.2.0.crate) = 8993 +SHA256 (rust/crates/tokio-macros-2.4.0.crate) = 693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752 +SIZE (rust/crates/tokio-macros-2.4.0.crate) = 12501 +SHA256 (rust/crates/tokio-native-tls-0.3.1.crate) = bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2 +SIZE (rust/crates/tokio-native-tls-0.3.1.crate) = 20676 +SHA256 (rust/crates/tokio-openssl-0.6.5.crate) = 59df6849caa43bb7567f9a36f863c447d95a11d5903c9cc334ba32576a27eadd +SIZE (rust/crates/tokio-openssl-0.6.5.crate) = 11977 +SHA256 (rust/crates/tokio-rustls-0.24.1.crate) = c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081 +SIZE (rust/crates/tokio-rustls-0.24.1.crate) = 33049 +SHA256 (rust/crates/tokio-rustls-0.26.1.crate) = 5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37 +SIZE (rust/crates/tokio-rustls-0.26.1.crate) = 31214 +SHA256 (rust/crates/tokio-stream-0.1.17.crate) = eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047 +SIZE (rust/crates/tokio-stream-0.1.17.crate) = 38477 +SHA256 (rust/crates/tokio-util-0.7.13.crate) = d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078 +SIZE (rust/crates/tokio-util-0.7.13.crate) = 115191 +SHA256 (rust/crates/toml-0.5.11.crate) = f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234 +SIZE (rust/crates/toml-0.5.11.crate) = 54910 +SHA256 (rust/crates/toml_datetime-0.6.8.crate) = 0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41 +SIZE (rust/crates/toml_datetime-0.6.8.crate) = 12028 +SHA256 (rust/crates/toml_edit-0.19.15.crate) = 1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421 +SIZE (rust/crates/toml_edit-0.19.15.crate) = 95324 +SHA256 (rust/crates/tonic-0.9.2.crate) = 3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a +SIZE (rust/crates/tonic-0.9.2.crate) = 92598 +SHA256 (rust/crates/tower-0.4.13.crate) = b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c +SIZE (rust/crates/tower-0.4.13.crate) = 106906 +SHA256 (rust/crates/tower-0.5.2.crate) = d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9 +SIZE (rust/crates/tower-0.5.2.crate) = 109417 +SHA256 (rust/crates/tower-http-0.6.2.crate) = 403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697 +SIZE (rust/crates/tower-http-0.6.2.crate) = 129672 +SHA256 (rust/crates/tower-layer-0.3.3.crate) = 121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e +SIZE (rust/crates/tower-layer-0.3.3.crate) = 6180 +SHA256 (rust/crates/tower-service-0.3.3.crate) = 8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3 +SIZE (rust/crates/tower-service-0.3.3.crate) = 6950 +SHA256 (rust/crates/tracing-0.1.41.crate) = 784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0 +SIZE (rust/crates/tracing-0.1.41.crate) = 82448 +SHA256 (rust/crates/tracing-attributes-0.1.28.crate) = 395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d +SIZE (rust/crates/tracing-attributes-0.1.28.crate) = 33280 +SHA256 (rust/crates/tracing-core-0.1.33.crate) = e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c +SIZE (rust/crates/tracing-core-0.1.33.crate) = 63434 +SHA256 (rust/crates/tracing-forest-0.1.6.crate) = ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f +SIZE (rust/crates/tracing-forest-0.1.6.crate) = 28565 +SHA256 (rust/crates/tracing-log-0.1.4.crate) = f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2 +SIZE (rust/crates/tracing-log-0.1.4.crate) = 20640 +SHA256 (rust/crates/tracing-log-0.2.0.crate) = ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3 +SIZE (rust/crates/tracing-log-0.2.0.crate) = 17561 +SHA256 (rust/crates/tracing-opentelemetry-0.21.0.crate) = 75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8 +SIZE (rust/crates/tracing-opentelemetry-0.21.0.crate) = 131576 +SHA256 (rust/crates/tracing-subscriber-0.3.19.crate) = e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008 +SIZE (rust/crates/tracing-subscriber-0.3.19.crate) = 198345 +SHA256 (rust/crates/try-lock-0.2.5.crate) = e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b +SIZE (rust/crates/try-lock-0.2.5.crate) = 4314 +SHA256 (rust/crates/tss-esapi-8.0.0-alpha.crate) = 3c1617a46161846de3a3d3e407cd30cb345599bc5e440c3907a59b34b75a2731 +SIZE (rust/crates/tss-esapi-8.0.0-alpha.crate) = 290448 +SHA256 (rust/crates/tss-esapi-sys-0.5.0.crate) = 535cd192581c2ec4d5f82e670b1d3fbba6a23ccce8c85de387642051d7cad5b5 +SIZE (rust/crates/tss-esapi-sys-0.5.0.crate) = 167811 +SHA256 (rust/crates/typenum-1.17.0.crate) = 42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825 +SIZE (rust/crates/typenum-1.17.0.crate) = 42849 +SHA256 (rust/crates/unicase-2.8.0.crate) = 7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df +SIZE (rust/crates/unicase-2.8.0.crate) = 23843 +SHA256 (rust/crates/unicode-bom-2.0.3.crate) = 7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217 +SIZE (rust/crates/unicode-bom-2.0.3.crate) = 10773 +SHA256 (rust/crates/unicode-ident-1.0.14.crate) = adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83 +SIZE (rust/crates/unicode-ident-1.0.14.crate) = 47547 +SHA256 (rust/crates/unicode-normalization-0.1.24.crate) = 5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956 +SIZE (rust/crates/unicode-normalization-0.1.24.crate) = 126536 +SHA256 (rust/crates/unicode-segmentation-1.12.0.crate) = f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493 +SIZE (rust/crates/unicode-segmentation-1.12.0.crate) = 106323 +SHA256 (rust/crates/unicode-width-0.2.0.crate) = 1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd +SIZE (rust/crates/unicode-width-0.2.0.crate) = 271509 +SHA256 (rust/crates/untrusted-0.9.0.crate) = 8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1 +SIZE (rust/crates/untrusted-0.9.0.crate) = 14447 +SHA256 (rust/crates/url-2.5.4.crate) = 32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60 +SIZE (rust/crates/url-2.5.4.crate) = 81097 +SHA256 (rust/crates/urlencoding-2.1.3.crate) = daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da +SIZE (rust/crates/urlencoding-2.1.3.crate) = 6538 +SHA256 (rust/crates/utf16_iter-1.0.5.crate) = c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246 +SIZE (rust/crates/utf16_iter-1.0.5.crate) = 9736 +SHA256 (rust/crates/utf8_iter-1.0.4.crate) = b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be +SIZE (rust/crates/utf8_iter-1.0.4.crate) = 10437 +SHA256 (rust/crates/utf8parse-0.2.2.crate) = 06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821 +SIZE (rust/crates/utf8parse-0.2.2.crate) = 13499 +SHA256 (rust/crates/utoipa-4.2.3.crate) = c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23 +SIZE (rust/crates/utoipa-4.2.3.crate) = 54759 +SHA256 (rust/crates/utoipa-gen-4.3.1.crate) = 20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392 +SIZE (rust/crates/utoipa-gen-4.3.1.crate) = 142985 +SHA256 (rust/crates/utoipa-swagger-ui-6.0.0.crate) = 0b39868d43c011961e04b41623e050aedf2cc93652562ff7935ce0f819aaf2da +SIZE (rust/crates/utoipa-swagger-ui-6.0.0.crate) = 4372387 +SHA256 (rust/crates/uuid-1.11.0.crate) = f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a +SIZE (rust/crates/uuid-1.11.0.crate) = 47683 +SHA256 (rust/crates/uuid-simd-0.8.0.crate) = 23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8 +SIZE (rust/crates/uuid-simd-0.8.0.crate) = 6959 +SHA256 (rust/crates/valuable-0.1.0.crate) = 830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d +SIZE (rust/crates/valuable-0.1.0.crate) = 27718 +SHA256 (rust/crates/vcpkg-0.2.15.crate) = accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426 +SIZE (rust/crates/vcpkg-0.2.15.crate) = 228735 +SHA256 (rust/crates/version_check-0.9.5.crate) = 0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a +SIZE (rust/crates/version_check-0.9.5.crate) = 15554 +SHA256 (rust/crates/vsimd-0.8.0.crate) = 5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64 +SIZE (rust/crates/vsimd-0.8.0.crate) = 21377 +SHA256 (rust/crates/wait-timeout-0.2.0.crate) = 9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6 +SIZE (rust/crates/wait-timeout-0.2.0.crate) = 12441 +SHA256 (rust/crates/walkdir-2.5.0.crate) = 29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b +SIZE (rust/crates/walkdir-2.5.0.crate) = 23951 +SHA256 (rust/crates/want-0.3.1.crate) = bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e +SIZE (rust/crates/want-0.3.1.crate) = 6398 +SHA256 (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423 +SIZE (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 28131 +SHA256 (rust/crates/wasite-0.1.0.crate) = b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b +SIZE (rust/crates/wasite-0.1.0.crate) = 2346 +SHA256 (rust/crates/wasm-bindgen-0.2.99.crate) = a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396 +SIZE (rust/crates/wasm-bindgen-0.2.99.crate) = 46136 +SHA256 (rust/crates/wasm-bindgen-backend-0.2.99.crate) = 5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79 +SIZE (rust/crates/wasm-bindgen-backend-0.2.99.crate) = 30928 +SHA256 (rust/crates/wasm-bindgen-futures-0.4.49.crate) = 38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2 +SIZE (rust/crates/wasm-bindgen-futures-0.4.49.crate) = 14838 +SHA256 (rust/crates/wasm-bindgen-macro-0.2.99.crate) = 2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe +SIZE (rust/crates/wasm-bindgen-macro-0.2.99.crate) = 7011 +SHA256 (rust/crates/wasm-bindgen-macro-support-0.2.99.crate) = 30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2 +SIZE (rust/crates/wasm-bindgen-macro-support-0.2.99.crate) = 22800 +SHA256 (rust/crates/wasm-bindgen-shared-0.2.99.crate) = 943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6 +SIZE (rust/crates/wasm-bindgen-shared-0.2.99.crate) = 7773 +SHA256 (rust/crates/web-sys-0.3.76.crate) = 04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc +SIZE (rust/crates/web-sys-0.3.76.crate) = 635842 +SHA256 (rust/crates/web-time-1.1.0.crate) = 5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb +SIZE (rust/crates/web-time-1.1.0.crate) = 18026 +SHA256 (rust/crates/webauthn-attestation-ca-0.5.1.crate) = 29e77e8859ecb93b00e4a8e56ae45f8a8dd69b1539e3d32cf4cce1db9a3a0b99 +SIZE (rust/crates/webauthn-attestation-ca-0.5.1.crate) = 3903 +SHA256 (rust/crates/webauthn-authenticator-rs-0.5.1.crate) = 1bc2f8b61965979d9dd561dc8288a89e01ecf224179b40d5d496141225b540b4 +SIZE (rust/crates/webauthn-authenticator-rs-0.5.1.crate) = 207382 +SHA256 (rust/crates/webauthn-rs-0.5.1.crate) = 8b44347ee0d66f222043663a6aaf5ec78022b9b11c3a9ed488c21f2bd5680856 +SIZE (rust/crates/webauthn-rs-0.5.1.crate) = 20150 +SHA256 (rust/crates/webauthn-rs-core-0.5.1.crate) = 2ef48f07ed8f3dfe304d6c48e85317feba0439675f31a13063b2936c9b4eaf0d +SIZE (rust/crates/webauthn-rs-core-0.5.1.crate) = 123169 +SHA256 (rust/crates/webauthn-rs-proto-0.5.1.crate) = 14e1367f70e7dc7b83afc971ce8a54d578f4fdf488ea093021180e073744a69f +SIZE (rust/crates/webauthn-rs-proto-0.5.1.crate) = 13873 +SHA256 (rust/crates/webdriver-0.50.0.crate) = 144ab979b12d36d65065635e646549925de229954de2eb3b47459b432a42db71 +SIZE (rust/crates/webdriver-0.50.0.crate) = 32046 +SHA256 (rust/crates/webpki-roots-0.25.4.crate) = 5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1 +SIZE (rust/crates/webpki-roots-0.25.4.crate) = 253559 +SHA256 (rust/crates/webpki-roots-0.26.7.crate) = 5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e +SIZE (rust/crates/webpki-roots-0.26.7.crate) = 249392 +SHA256 (rust/crates/weezl-0.1.8.crate) = 53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082 +SIZE (rust/crates/weezl-0.1.8.crate) = 42175 +SHA256 (rust/crates/which-4.4.2.crate) = 87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7 +SIZE (rust/crates/which-4.4.2.crate) = 15953 +SHA256 (rust/crates/whoami-1.5.2.crate) = 372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d +SIZE (rust/crates/whoami-1.5.2.crate) = 24204 +SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419 +SIZE (rust/crates/winapi-0.3.9.crate) = 1200382 +SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6 +SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815 +SHA256 (rust/crates/winapi-util-0.1.9.crate) = cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb +SIZE (rust/crates/winapi-util-0.1.9.crate) = 12464 +SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f +SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998 +SHA256 (rust/crates/windows-0.41.0.crate) = 5a3ed69de2c1f8d0524a8a3417a80a85dd316a071745fbfdf5eb028b310058ab +SIZE (rust/crates/windows-0.41.0.crate) = 11980400 +SHA256 (rust/crates/windows-core-0.52.0.crate) = 33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9 +SIZE (rust/crates/windows-core-0.52.0.crate) = 42154 +SHA256 (rust/crates/windows-registry-0.2.0.crate) = e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0 +SIZE (rust/crates/windows-registry-0.2.0.crate) = 10470 +SHA256 (rust/crates/windows-result-0.2.0.crate) = 1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e +SIZE (rust/crates/windows-result-0.2.0.crate) = 12756 +SHA256 (rust/crates/windows-strings-0.1.0.crate) = 4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10 +SIZE (rust/crates/windows-strings-0.1.0.crate) = 13832 +SHA256 (rust/crates/windows-sys-0.48.0.crate) = 677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9 +SIZE (rust/crates/windows-sys-0.48.0.crate) = 2628884 +SHA256 (rust/crates/windows-sys-0.52.0.crate) = 282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d +SIZE (rust/crates/windows-sys-0.52.0.crate) = 2576877 +SHA256 (rust/crates/windows-sys-0.59.0.crate) = 1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b +SIZE (rust/crates/windows-sys-0.59.0.crate) = 2387323 +SHA256 (rust/crates/windows-targets-0.48.5.crate) = 9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c +SIZE (rust/crates/windows-targets-0.48.5.crate) = 6904 +SHA256 (rust/crates/windows-targets-0.52.6.crate) = 9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973 +SIZE (rust/crates/windows-targets-0.52.6.crate) = 6403 +SHA256 (rust/crates/windows_aarch64_gnullvm-0.41.0.crate) = 163d2761774f2278ecb4e6719e80b2b5e92e5a2be73a7bcd3ef624dd5e3091fd +SIZE (rust/crates/windows_aarch64_gnullvm-0.41.0.crate) = 357917 +SHA256 (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8 +SIZE (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 418492 +SHA256 (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3 +SIZE (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 435718 +SHA256 (rust/crates/windows_aarch64_msvc-0.41.0.crate) = ef005ff2bceb00d3b84166a359cc19084f9459754fd3fe5a504dee3dddcd0a0c +SIZE (rust/crates/windows_aarch64_msvc-0.41.0.crate) = 659427 +SHA256 (rust/crates/windows_aarch64_msvc-0.48.5.crate) = dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc +SIZE (rust/crates/windows_aarch64_msvc-0.48.5.crate) = 798483 +SHA256 (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469 +SIZE (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 832615 +SHA256 (rust/crates/windows_i686_gnu-0.41.0.crate) = 02b4df2d51e32f03f8b4b228e487828c03bcb36d97b216fc5463bcea5bb1440b +SIZE (rust/crates/windows_i686_gnu-0.41.0.crate) = 728572 +SHA256 (rust/crates/windows_i686_gnu-0.48.5.crate) = a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e +SIZE (rust/crates/windows_i686_gnu-0.48.5.crate) = 844891 +SHA256 (rust/crates/windows_i686_gnu-0.52.6.crate) = 8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b +SIZE (rust/crates/windows_i686_gnu-0.52.6.crate) = 880402 +SHA256 (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66 +SIZE (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 475940 +SHA256 (rust/crates/windows_i686_msvc-0.41.0.crate) = 568a966834571f2f3267f07dd72b4d8507381f25e53d056808483b2637385ef7 +SIZE (rust/crates/windows_i686_msvc-0.41.0.crate) = 717481 +SHA256 (rust/crates/windows_i686_msvc-0.48.5.crate) = 8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406 +SIZE (rust/crates/windows_i686_msvc-0.48.5.crate) = 864300 +SHA256 (rust/crates/windows_i686_msvc-0.52.6.crate) = 240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66 +SIZE (rust/crates/windows_i686_msvc-0.52.6.crate) = 901163 +SHA256 (rust/crates/windows_x86_64_gnu-0.41.0.crate) = fc395dac1adf444e276d096d933ae7961361c8cda3245cffef7a9b3a70a8f994 +SIZE (rust/crates/windows_x86_64_gnu-0.41.0.crate) = 692491 +SHA256 (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e +SIZE (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 801619 +SHA256 (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78 +SIZE (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 836363 +SHA256 (rust/crates/windows_x86_64_gnullvm-0.41.0.crate) = 90e8ec22b715d5b436e1d59c8adad6c744dc20cd984710121d5836b4e8dbb5e0 +SIZE (rust/crates/windows_x86_64_gnullvm-0.41.0.crate) = 357903 +SHA256 (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc +SIZE (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 418486 +SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d +SIZE (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 435707 +SHA256 (rust/crates/windows_x86_64_msvc-0.41.0.crate) = 8b9761f0216b669019df1512f6e25e5ee779bf61c5cdc43c7293858e7efd7926 +SIZE (rust/crates/windows_x86_64_msvc-0.41.0.crate) = 659379 +SHA256 (rust/crates/windows_x86_64_msvc-0.48.5.crate) = ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538 +SIZE (rust/crates/windows_x86_64_msvc-0.48.5.crate) = 798412 +SHA256 (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec +SIZE (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 832564 +SHA256 (rust/crates/winnow-0.5.40.crate) = f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876 +SIZE (rust/crates/winnow-0.5.40.crate) = 159316 +SHA256 (rust/crates/winnow-0.6.20.crate) = 36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b +SIZE (rust/crates/winnow-0.6.20.crate) = 163617 +SHA256 (rust/crates/winreg-0.50.0.crate) = 524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1 +SIZE (rust/crates/winreg-0.50.0.crate) = 29703 +SHA256 (rust/crates/write16-1.0.0.crate) = d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936 +SIZE (rust/crates/write16-1.0.0.crate) = 7218 +SHA256 (rust/crates/writeable-0.5.5.crate) = 1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51 +SIZE (rust/crates/writeable-0.5.5.crate) = 22354 +SHA256 (rust/crates/x509-cert-0.2.5.crate) = 1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94 +SIZE (rust/crates/x509-cert-0.2.5.crate) = 99819 +SHA256 (rust/crates/x509-parser-0.16.0.crate) = fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69 +SIZE (rust/crates/x509-parser-0.16.0.crate) = 92925 +SHA256 (rust/crates/yoke-0.7.5.crate) = 120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40 +SIZE (rust/crates/yoke-0.7.5.crate) = 29673 +SHA256 (rust/crates/yoke-derive-0.7.5.crate) = 2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154 +SIZE (rust/crates/yoke-derive-0.7.5.crate) = 7525 +SHA256 (rust/crates/zerocopy-0.7.35.crate) = 1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0 +SIZE (rust/crates/zerocopy-0.7.35.crate) = 152645 +SHA256 (rust/crates/zerocopy-derive-0.7.35.crate) = fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e +SIZE (rust/crates/zerocopy-derive-0.7.35.crate) = 37829 +SHA256 (rust/crates/zerofrom-0.1.5.crate) = cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e +SIZE (rust/crates/zerofrom-0.1.5.crate) = 5091 +SHA256 (rust/crates/zerofrom-derive-0.1.5.crate) = 595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808 +SIZE (rust/crates/zerofrom-derive-0.1.5.crate) = 8285 +SHA256 (rust/crates/zeroize-1.8.1.crate) = ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde +SIZE (rust/crates/zeroize-1.8.1.crate) = 20029 +SHA256 (rust/crates/zeroize_derive-1.4.2.crate) = ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69 +SIZE (rust/crates/zeroize_derive-1.4.2.crate) = 11141 +SHA256 (rust/crates/zerovec-0.10.4.crate) = aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079 +SIZE (rust/crates/zerovec-0.10.4.crate) = 126398 +SHA256 (rust/crates/zerovec-derive-0.10.3.crate) = 6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6 +SIZE (rust/crates/zerovec-derive-0.10.3.crate) = 19438 +SHA256 (rust/crates/zip-0.6.6.crate) = 760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261 +SIZE (rust/crates/zip-0.6.6.crate) = 65789 +SHA256 (rust/crates/zxcvbn-2.2.2.crate) = 103fa851fff70ea29af380e87c25c48ff7faac5c530c70bd0e65366d4e0c94e4 +SIZE (rust/crates/zxcvbn-2.2.2.crate) = 423636 +SHA256 (kanidm-kanidm-g20250201-5eb9a4430f4beab41aed7d5d77414ceea6b2eb1c_GH0.tar.gz) = 4fe80989fe900ad05cb73c076a298e70804231c16f3b02df2b71f2dcbc9f0ead +SIZE (kanidm-kanidm-g20250201-5eb9a4430f4beab41aed7d5d77414ceea6b2eb1c_GH0.tar.gz) = 8594529 diff --git a/platform/freebsd/client/files/kanidm_unixd.in b/platform/freebsd/client/files/kanidm_unixd.in new file mode 100644 index 000000000..77e87f6b6 --- /dev/null +++ b/platform/freebsd/client/files/kanidm_unixd.in @@ -0,0 +1,27 @@ +#!/bin/sh + +# PROVIDE: kanidm_unixd +# REQUIRE: LOGIN +# KEYWORD: shutdown +# +# Add these lines to /etc/rc.conf.local or /etc/rc.conf +# to enable this service: +# +# kanidm_unixd_enable (bool): Set to NO by default. +# Set it to YES to enable kanidm_unixd. + +. /etc/rc.subr + +name=kanidm_unixd +rcvar=kanidm_unixd_enable + +load_rc_config $name + +: ${kanidm_unixd_enable:="NO"} + +pidfile="/var/run/kanidm-unixd.pid" +command=/usr/sbin/daemon +command_args="-u _kanidm_unixd -p /var/run/kanidm-unixd.pid -T kanidm_unixd /usr/local/libexec/${name}" +procname=/usr/local/libexec/${name} + +run_rc_command "$1" diff --git a/platform/freebsd/client/files/kanidm_unixd_tasks.in b/platform/freebsd/client/files/kanidm_unixd_tasks.in new file mode 100644 index 000000000..1ed3000e7 --- /dev/null +++ b/platform/freebsd/client/files/kanidm_unixd_tasks.in @@ -0,0 +1,27 @@ +#!/bin/sh + +# PROVIDE: kanidm_unixd_tasks +# REQUIRE: LOGIN +# KEYWORD: shutdown +# +# Add these lines to /etc/rc.conf.local or /etc/rc.conf +# to enable this service: +# +# kanidm_unixd_tasks_enable (bool): Set to NO by default. +# Set it to YES to enable kanidm_unixd_tasks. + +. /etc/rc.subr + +name=kanidm_unixd_tasks +rcvar=kanidm_unixd_tasks_enable + +load_rc_config $name + +: ${kanidm_unixd_tasks_enable:="NO"} + +pidfile="/var/run/kanidm-unixd-tasks.pid" +command=/usr/sbin/daemon +command_args="-u _kanidm_unixd -p /var/run/kanidm-unixd-tasks.pid -T kanidm_unixd_tasks /usr/local/libexec/${name}" +procname=/usr/local/libexec/${name} + +run_rc_command "$1" diff --git a/platform/freebsd/client/pkg-descr b/platform/freebsd/client/pkg-descr new file mode 100644 index 000000000..9d0b9947d --- /dev/null +++ b/platform/freebsd/client/pkg-descr @@ -0,0 +1 @@ +Kanidm is a simple and secure identity provider and client for UNIX systems diff --git a/platform/freebsd/client/pkg-plist b/platform/freebsd/client/pkg-plist new file mode 100644 index 000000000..a4cc43986 --- /dev/null +++ b/platform/freebsd/client/pkg-plist @@ -0,0 +1,13 @@ +bin/kanidm +bin/kanidm-unix +bin/kanidm_ssh_authorizedkeys +bin/kanidm_ssh_authorizedkeys_direct +lib/nss_kanidm.so.1 +lib/libpam_kanidm.so +libexec/kanidm_unixd +libexec/kanidm_unixd_tasks +@dir %%ETCDIR%% +@dir /var/lib +@dir(_kanidm_unixd,_kanidm_unixd,750) /var/cache/kanidm-unixd +@dir(_kanidm_unixd,_kanidm_unixd,750) /var/lib/kanidm-unixd +@dir(_kanidm_unixd,_kanidm_unixd,750) /var/run/kanidm-unixd diff --git a/server/core/src/config.rs b/server/core/src/config.rs index 1f089a6ca..62b0e1888 100644 --- a/server/core/src/config.rs +++ b/server/core/src/config.rs @@ -574,7 +574,7 @@ impl Configuration { Configuration { address: DEFAULT_SERVER_ADDRESS.to_string(), ldapaddress: None, - adminbindpath: env!("KANIDM_ADMIN_BIND_PATH").to_string(), + adminbindpath: env!("KANIDM_SERVER_ADMIN_BIND_PATH").to_string(), threads: std::thread::available_parallelism() .map(|t| t.get()) .unwrap_or_else(|_e| { diff --git a/server/core/src/https/mod.rs b/server/core/src/https/mod.rs index ae48307fa..6b8e34cdd 100644 --- a/server/core/src/https/mod.rs +++ b/server/core/src/https/mod.rs @@ -131,7 +131,7 @@ pub(crate) fn get_js_files(role: ServerRole) -> Result, ()> if !matches!(role, ServerRole::WriteReplicaNoUI) { // let's set up the list of js module hashes - let pkg_path = env!("KANIDM_HTMX_UI_PKG_PATH").to_owned(); + let pkg_path = env!("KANIDM_SERVER_UI_PKG_PATH").to_owned(); let filelist = [ "external/bootstrap.bundle.min.js", @@ -254,11 +254,11 @@ pub async fn create_https_server( let app = match config.role { ServerRole::WriteReplicaNoUI => app, ServerRole::WriteReplica | ServerRole::ReadOnlyReplica => { - let pkg_path = PathBuf::from(env!("KANIDM_HTMX_UI_PKG_PATH")); + let pkg_path = PathBuf::from(env!("KANIDM_SERVER_UI_PKG_PATH")); if !pkg_path.exists() { eprintln!( "Couldn't find htmx UI package path: ({}), quitting.", - env!("KANIDM_HTMX_UI_PKG_PATH") + env!("KANIDM_SERVER_UI_PKG_PATH") ); std::process::exit(1); } diff --git a/server/daemon/src/main.rs b/server/daemon/src/main.rs index 6501c5fe6..4f44f3dba 100644 --- a/server/daemon/src/main.rs +++ b/server/daemon/src/main.rs @@ -560,12 +560,12 @@ fn main() -> ExitCode { let mut config_error: Vec = Vec::new(); let mut config = Configuration::new(); - if env!("KANIDM_DEFAULT_CONFIG_PATH").is_empty() { - println!("CRITICAL: Kanidmd was not built correctly and is missing a valid KANIDM_DEFAULT_CONFIG_PATH value"); + if env!("KANIDM_SERVER_CONFIG_PATH").is_empty() { + println!("CRITICAL: Kanidmd was not built correctly and is missing a valid KANIDM_SERVER_CONFIG_PATH value"); return ExitCode::FAILURE; } - let default_config_path = PathBuf::from(env!("KANIDM_DEFAULT_CONFIG_PATH")); + let default_config_path = PathBuf::from(env!("KANIDM_SERVER_CONFIG_PATH")); let maybe_config_path = if let Some(p) = opt.config_path() { Some(p) diff --git a/unix_integration/common/src/constants.rs b/unix_integration/common/src/constants.rs index 9ddf23e78..7f5ec9f3f 100644 --- a/unix_integration/common/src/constants.rs +++ b/unix_integration/common/src/constants.rs @@ -1,13 +1,13 @@ use crate::unix_config::{HomeAttr, UidAttr}; -pub const DEFAULT_CONFIG_PATH: &str = "/etc/kanidm/unixd"; +pub const DEFAULT_CONFIG_PATH: &str = env!("KANIDM_RESOLVER_CONFIG_PATH"); pub const DEFAULT_SOCK_PATH: &str = "/var/run/kanidm-unixd/sock"; pub const DEFAULT_TASK_SOCK_PATH: &str = "/var/run/kanidm-unixd/task_sock"; pub const DEFAULT_PERSISTENT_DB_PATH: &str = "/var/lib/kanidm-unixd/kanidm.db"; pub const DEFAULT_CACHE_DB_PATH: &str = "/var/cache/kanidm-unixd/kanidm.cache.db"; pub const DEFAULT_CONN_TIMEOUT: u64 = 2; pub const DEFAULT_CACHE_TIMEOUT: u64 = 15; -pub const DEFAULT_SHELL: &str = env!("KANIDM_DEFAULT_UNIX_SHELL_PATH"); +pub const DEFAULT_SHELL: &str = env!("KANIDM_RESOLVER_UNIX_SHELL_PATH"); pub const DEFAULT_HOME_PREFIX: &str = "/home/"; pub const DEFAULT_HOME_ATTR: HomeAttr = HomeAttr::Uuid; pub const DEFAULT_HOME_ALIAS: Option = Some(HomeAttr::Spn); diff --git a/unix_integration/nss_kanidm/Cargo.toml b/unix_integration/nss_kanidm/Cargo.toml index 0f145d3fb..76ba3bf07 100644 --- a/unix_integration/nss_kanidm/Cargo.toml +++ b/unix_integration/nss_kanidm/Cargo.toml @@ -24,6 +24,9 @@ libc = { workspace = true } paste = { workspace = true } lazy_static = { workspace = true } +[target."cfg(target_os = \"freebsd\")".build-dependencies] +cc = "^1.2.6" + ## Debian packaging # The base metadata does **not** work to build a functioning package! # A target specific variant must be used to get the right multiarch path. diff --git a/unix_integration/nss_kanidm/build.rs b/unix_integration/nss_kanidm/build.rs new file mode 100644 index 000000000..e270996e8 --- /dev/null +++ b/unix_integration/nss_kanidm/build.rs @@ -0,0 +1,12 @@ +fn main() { + #[cfg(target_os = "freebsd")] + { + println!("cargo::rerun-if-changed=src/freebsd_nss.c"); + + cc::Build::new() + .file("src/freebsd_nss.c") + .static_flag(true) + .link_lib_modifier("+whole-archive") + .compile("freebsd_nss"); + } +} diff --git a/unix_integration/nss_kanidm/src/freebsd_nss.c b/unix_integration/nss_kanidm/src/freebsd_nss.c new file mode 100644 index 000000000..58da969d1 --- /dev/null +++ b/unix_integration/nss_kanidm/src/freebsd_nss.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include + +extern enum nss_status _nss_kanidm_getgrent_r(struct group *, char *, size_t, + int *); +extern enum nss_status _nss_kanidm_getgrnam_r(const char *, struct group *, + char *, size_t, int *); +extern enum nss_status _nss_kanidm_getgrgid_r(gid_t gid, struct group *, char *, + size_t, int *); +extern enum nss_status _nss_kanidm_setgrent(void); +extern enum nss_status _nss_kanidm_endgrent(void); + +extern enum nss_status _nss_kanidm_getpwent_r(struct passwd *, char *, size_t, + int *); +extern enum nss_status _nss_kanidm_getpwnam_r(const char *, struct passwd *, + char *, size_t, int *); +extern enum nss_status _nss_kanidm_getpwuid_r(gid_t gid, struct passwd *, char *, + size_t, int *); +extern enum nss_status _nss_kanidm_setpwent(void); +extern enum nss_status _nss_kanidm_endpwent(void); + +extern enum nss_status _nss_kanidm_gethostbyname_r(const char *name, + struct hostent * result, + char *buffer, size_t buflen, + int *errnop, + int *h_errnop); + +extern enum nss_status _nss_kanidm_gethostbyname2_r(const char *name, int af, + struct hostent * result, + char *buffer, size_t buflen, + int *errnop, + int *h_errnop); +extern enum nss_status _nss_kanidm_gethostbyaddr_r(struct in_addr * addr, int len, + int type, + struct hostent * result, + char *buffer, size_t buflen, + int *errnop, int *h_errnop); + +extern enum nss_status _nss_kanidm_getgroupmembership(const char *uname, + gid_t agroup, gid_t *groups, + int maxgrp, int *grpcnt); + +NSS_METHOD_PROTOTYPE(__nss_compat_getgrnam_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getgrgid_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getgrent_r); +NSS_METHOD_PROTOTYPE(__nss_compat_setgrent); +NSS_METHOD_PROTOTYPE(__nss_compat_endgrent); + +NSS_METHOD_PROTOTYPE(__nss_compat_getpwnam_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getpwuid_r); +NSS_METHOD_PROTOTYPE(__nss_compat_getpwent_r); +NSS_METHOD_PROTOTYPE(__nss_compat_setpwent); +NSS_METHOD_PROTOTYPE(__nss_compat_endpwent); + +static ns_mtab methods[] = { + { NSDB_GROUP, "getgrnam_r", __nss_compat_getgrnam_r, _nss_kanidm_getgrnam_r }, + { NSDB_GROUP, "getgrgid_r", __nss_compat_getgrgid_r, _nss_kanidm_getgrgid_r }, + { NSDB_GROUP, "getgrent_r", __nss_compat_getgrent_r, _nss_kanidm_getgrent_r }, + { NSDB_GROUP, "setgrent", __nss_compat_setgrent, _nss_kanidm_setgrent }, + { NSDB_GROUP, "endgrent", __nss_compat_endgrent, _nss_kanidm_endgrent }, + + { NSDB_PASSWD, "getpwnam_r", __nss_compat_getpwnam_r, _nss_kanidm_getpwnam_r }, + { NSDB_PASSWD, "getpwuid_r", __nss_compat_getpwuid_r, _nss_kanidm_getpwuid_r }, + { NSDB_PASSWD, "getpwent_r", __nss_compat_getpwent_r, _nss_kanidm_getpwent_r }, + { NSDB_PASSWD, "setpwent", __nss_compat_setpwent, _nss_kanidm_setpwent }, + { NSDB_PASSWD, "endpwent", __nss_compat_endpwent, _nss_kanidm_endpwent }, + + { NSDB_GROUP_COMPAT, "getgrnam_r", __nss_compat_getgrnam_r, _nss_kanidm_getgrnam_r }, + { NSDB_GROUP_COMPAT, "getgrgid_r", __nss_compat_getgrgid_r, _nss_kanidm_getgrgid_r }, + { NSDB_GROUP_COMPAT, "getgrent_r", __nss_compat_getgrent_r, _nss_kanidm_getgrent_r }, + { NSDB_GROUP_COMPAT, "setgrent", __nss_compat_setgrent, _nss_kanidm_setgrent }, + { NSDB_GROUP_COMPAT, "endgrent", __nss_compat_endgrent, _nss_kanidm_endgrent }, + + { NSDB_PASSWD_COMPAT, "getpwnam_r", __nss_compat_getpwnam_r, _nss_kanidm_getpwnam_r }, + { NSDB_PASSWD_COMPAT, "getpwuid_r", __nss_compat_getpwuid_r, _nss_kanidm_getpwuid_r }, + { NSDB_PASSWD_COMPAT, "getpwent_r", __nss_compat_getpwent_r, _nss_kanidm_getpwent_r }, + { NSDB_PASSWD_COMPAT, "setpwent", __nss_compat_setpwent, _nss_kanidm_setpwent }, + { NSDB_PASSWD_COMPAT, "endpwent", __nss_compat_endpwent, _nss_kanidm_endpwent }, +}; + +ns_mtab * +_nss_module_register(__attribute__((unused)) const char *source, unsigned int *mtabsize, + nss_module_unregister_fn *unreg) +{ + *mtabsize = sizeof(methods)/sizeof(methods[0]); + *unreg = NULL; + return (methods); +} + diff --git a/unix_integration/nss_kanidm/src/lib.rs b/unix_integration/nss_kanidm/src/lib.rs index 0ac5c7cbc..afefb4d80 100644 --- a/unix_integration/nss_kanidm/src/lib.rs +++ b/unix_integration/nss_kanidm/src/lib.rs @@ -10,6 +10,32 @@ #![deny(clippy::needless_pass_by_value)] #![deny(clippy::trivially_copy_pass_by_ref)] +#[cfg(target_os = "freebsd")] +/// BSD nss is quite different to that of linux (rather, glibc). As a result of this +/// FreeBSD kindly offers us wrappers to allow compatability of the two. But to +/// do this we need a .c file to include the macros and export tables, as well as +/// handling the variadic args (which rust doesn't). +/// +/// The issue is that even though we link our static archive, rust won't export any +/// of the symbols from it *unless* a rust source file actually consumes at least +/// one of them. This means we can't just link to our .a and have it do the work, +/// we need to wrap and expose this shim function to convince rust to actually +/// link to the archive +/// +/// https://github.com/rust-lang/rust/issues/78827 +mod bsd_nss_compat { + use std::ffi::c_void; + + extern "C" { + pub fn _nss_module_register(a: *mut c_void, b: *mut c_void, c: *mut c_void); + } + + #[no_mangle] + pub extern "C" fn nss_module_register(a: *mut c_void, b: *mut c_void, c: *mut c_void) { + unsafe { _nss_module_register(a, b, c) } + } +} + #[cfg(target_family = "unix")] #[macro_use] extern crate libnss; From 5562625d75a48e743c84e10fad70818b25a2f78c Mon Sep 17 00:00:00 2001 From: Firstyear Date: Sat, 4 Jan 2025 10:33:01 +1000 Subject: [PATCH 39/87] cookies don't clear unless you set domain (#3332) * make everything cookie consistent * Stricter on expiry * Relearn a painful lesson about needing domains in removal cookies * fix: DRY cookie creation code and reduce the sins --- server/core/src/https/views/cookies.rs | 50 +++++++------- server/core/src/https/views/login.rs | 42 +++++------- server/core/src/https/views/oauth2.rs | 90 ++++++++++++++------------ server/core/src/https/views/reset.rs | 8 +-- 4 files changed, 93 insertions(+), 97 deletions(-) diff --git a/server/core/src/https/views/cookies.rs b/server/core/src/https/views/cookies.rs index 966d0ee65..2f0d0d899 100644 --- a/server/core/src/https/views/cookies.rs +++ b/server/core/src/https/views/cookies.rs @@ -6,11 +6,29 @@ use compact_jwt::{Jws, JwsSigner}; use serde::de::DeserializeOwned; use serde::Serialize; -#[instrument(name = "views::cookies::destroy", level = "debug", skip(jar))] -pub fn destroy(jar: CookieJar, ck_id: &str) -> CookieJar { +fn new_cookie<'a>(state: &'_ ServerState, ck_id: &'a str, value: String) -> Cookie<'a> { + let mut token_cookie = Cookie::new(ck_id, value); + token_cookie.set_secure(state.secure_cookies); + token_cookie.set_same_site(SameSite::Lax); + // Prevent Document.cookie accessing this. Still works with fetch. + token_cookie.set_http_only(true); + // We set a domain here because it allows subdomains + // of the idm to share the cookie. If domain was incorrect + // then webauthn won't work anyway! + token_cookie.set_domain(state.domain.clone()); + token_cookie.set_path("/"); + token_cookie +} + +#[instrument(name = "views::cookies::destroy", level = "debug", skip(jar, state))] +pub fn destroy(jar: CookieJar, ck_id: &str, state: &ServerState) -> CookieJar { if let Some(ck) = jar.get(ck_id) { let mut removal_cookie = ck.clone(); removal_cookie.make_removal(); + + // Need to be set to domain else the cookie isn't removed! + removal_cookie.set_domain(state.domain.clone()); + // Need to be set to / to remove on all parent paths. // If you don't set a path, NOTHING IS REMOVED!!! removal_cookie.set_path("/"); @@ -21,30 +39,14 @@ pub fn destroy(jar: CookieJar, ck_id: &str) -> CookieJar { } } -pub fn make_unsigned<'a>( - state: &'_ ServerState, - ck_id: &'a str, - value: String, - path: &'a str, -) -> Cookie<'a> { - let mut token_cookie = Cookie::new(ck_id, value); - token_cookie.set_secure(state.secure_cookies); - token_cookie.set_same_site(SameSite::Lax); - // Prevent Document.cookie accessing this. Still works with fetch. - token_cookie.set_http_only(true); - // We set a domain here because it allows subdomains - // of the idm to share the cookie. If domain was incorrect - // then webauthn won't work anyway! - token_cookie.set_domain(state.domain.clone()); - token_cookie.set_path(path); - token_cookie +pub fn make_unsigned<'a>(state: &'_ ServerState, ck_id: &'a str, value: String) -> Cookie<'a> { + new_cookie(state, ck_id, value) } pub fn make_signed<'a, T: Serialize>( state: &'_ ServerState, ck_id: &'a str, value: &'_ T, - path: &'a str, ) -> Option> { let kref = &state.jws_signer; @@ -63,13 +65,7 @@ pub fn make_signed<'a, T: Serialize>( }) .ok()?; - let mut token_cookie = Cookie::new(ck_id, token); - token_cookie.set_secure(state.secure_cookies); - token_cookie.set_same_site(SameSite::Lax); - token_cookie.set_http_only(true); - token_cookie.set_path(path); - token_cookie.set_domain(state.domain.clone()); - Some(token_cookie) + Some(new_cookie(state, ck_id, token)) } pub fn get_signed( diff --git a/server/core/src/https/views/login.rs b/server/core/src/https/views/login.rs index ec6b7e38b..e9066e2a6 100644 --- a/server/core/src/https/views/login.rs +++ b/server/core/src/https/views/login.rs @@ -177,10 +177,10 @@ pub async fn view_logout_get( }; // Always clear cookies even on an error. - jar = cookies::destroy(jar, COOKIE_BEARER_TOKEN); - jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); - jar = cookies::destroy(jar, COOKIE_AUTH_SESSION_ID); - jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + jar = cookies::destroy(jar, COOKIE_BEARER_TOKEN, &state); + jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ, &state); + jar = cookies::destroy(jar, COOKIE_AUTH_SESSION_ID, &state); + jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN, &state); (jar, response).into_response() } @@ -195,7 +195,7 @@ pub async fn view_reauth_get( ) -> Response { // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ, &state); let session_valid_result = state .qe_r_ref @@ -322,7 +322,7 @@ pub async fn view_index_get( // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ, &state); match session_valid_result { Ok(()) => { @@ -915,14 +915,10 @@ async fn view_login_step( // Update jar let token_str = token.to_string(); - // Important - this can be make unsigned as token_str has it's own + // Important - this can be make unsigned as token_str has its own // signatures. - let mut bearer_cookie = cookies::make_unsigned( - &state, - COOKIE_BEARER_TOKEN, - token_str.clone(), - "/", - ); + let mut bearer_cookie = + cookies::make_unsigned(&state, COOKIE_BEARER_TOKEN, token_str.clone()); // Important - can be permanent as the token has its own expiration time internally bearer_cookie.make_permanent(); @@ -933,7 +929,6 @@ async fn view_login_step( &state, COOKIE_USERNAME, session_context.username.clone(), - Urls::Login.as_ref(), ); username_cookie.make_permanent(); jar.add(username_cookie) @@ -980,16 +975,11 @@ fn add_session_cookie( jar: CookieJar, session_context: &SessionContext, ) -> Result { - cookies::make_signed( - state, - COOKIE_AUTH_SESSION_ID, - session_context, - Urls::Login.as_ref(), - ) - .map(|mut cookie| { - // Not needed when redirecting into this site - cookie.set_same_site(SameSite::Strict); - jar.add(cookie) - }) - .ok_or(OperationError::InvalidSessionState) + cookies::make_signed(state, COOKIE_AUTH_SESSION_ID, session_context) + .map(|mut cookie| { + // Not needed when redirecting into this site + cookie.set_same_site(SameSite::Strict); + jar.add(cookie) + }) + .ok_or(OperationError::InvalidSessionState) } diff --git a/server/core/src/https/views/oauth2.rs b/server/core/src/https/views/oauth2.rs index ce0a7de7c..373d47208 100644 --- a/server/core/src/https/views/oauth2.rs +++ b/server/core/src/https/views/oauth2.rs @@ -26,7 +26,6 @@ use axum_extra::extract::cookie::{CookieJar, SameSite}; use axum_htmx::HX_REDIRECT; use serde::Deserialize; -use super::constants::Urls; use super::login::{LoginDisplayCtx, Oauth2Ctx}; use super::{cookies, UnrecoverableErrorView}; @@ -96,7 +95,7 @@ async fn oauth2_auth_req( ) -> Response { // No matter what, we always clear the stored oauth2 cookie to prevent // ui loops - let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ, &state); // If the auth_req was cross-signed, old, or just bad, error. But we have *cleared* it // from the cookie which means we won't see it again. @@ -149,14 +148,17 @@ async fn oauth2_auth_req( consent_token, }) => { // We can just render the form now, the consent token has everything we need. - ConsentRequestView { - client_name, - // scopes, - pii_scopes, - consent_token, - redirect: None, - } - .into_response() + ( + jar, + ConsentRequestView { + client_name, + // scopes, + pii_scopes, + consent_token, + redirect: None, + }, + ) + .into_response() } Ok(AuthoriseResponse::AuthenticationRequired { @@ -165,20 +167,19 @@ async fn oauth2_auth_req( }) => { // Sign the auth req and hide it in our cookie - we'll come back for // you later. - let maybe_jar = - cookies::make_signed(&state, COOKIE_OAUTH2_REQ, &auth_req, Urls::Ui.as_ref()) - .map(|mut cookie| { - cookie.set_same_site(SameSite::Strict); - // Expire at the end of the session. - cookie.set_expires(None); - // Could experiment with this to a shorter value, but session should be enough. - cookie.set_max_age(None); - jar.add(cookie) - }) - .ok_or(OperationError::InvalidSessionState); + let maybe_jar = cookies::make_signed(&state, COOKIE_OAUTH2_REQ, &auth_req) + .map(|mut cookie| { + cookie.set_same_site(SameSite::Strict); + // Expire at the end of the session. + cookie.set_expires(None); + // Could experiment with this to a shorter value, but session should be enough. + cookie.set_max_age(time::Duration::minutes(15)); + jar.clone().add(cookie) + }) + .ok_or(OperationError::InvalidSessionState); match maybe_jar { - Ok(jar) => { + Ok(new_jar) => { let display_ctx = LoginDisplayCtx { domain_info, oauth2: Some(Oauth2Ctx { client_name }), @@ -186,21 +187,27 @@ async fn oauth2_auth_req( error: None, }; - super::login::view_oauth2_get(jar, display_ctx, login_hint) + super::login::view_oauth2_get(new_jar, display_ctx, login_hint) } - Err(err_code) => UnrecoverableErrorView { - err_code, - operation_id: kopid.eventid, - } - .into_response(), + Err(err_code) => ( + jar, + UnrecoverableErrorView { + err_code, + operation_id: kopid.eventid, + }, + ) + .into_response(), } } Err(Oauth2Error::AccessDenied) => { // If scopes are not available for this account. - AccessDeniedView { - operation_id: kopid.eventid, - } - .into_response() + ( + jar, + AccessDeniedView { + operation_id: kopid.eventid, + }, + ) + .into_response() } /* RFC - If the request fails due to a missing, invalid, or mismatching @@ -219,11 +226,14 @@ async fn oauth2_auth_req( &err_code.to_string() ); - UnrecoverableErrorView { - err_code: OperationError::InvalidState, - operation_id: kopid.eventid, - } - .into_response() + ( + jar, + UnrecoverableErrorView { + err_code: OperationError::InvalidState, + operation_id: kopid.eventid, + }, + ) + .into_response() } } } @@ -237,13 +247,13 @@ pub struct ConsentForm { } pub async fn view_consent_post( - State(state): State, + State(server_state): State, Extension(kopid): Extension, VerifiedClientInformation(client_auth_info): VerifiedClientInformation, jar: CookieJar, Form(consent_form): Form, ) -> Result { - let res = state + let res = server_state .qe_w_ref .handle_oauth2_authorise_permit(client_auth_info, consent_form.consent_token, kopid.eventid) .await; @@ -254,7 +264,7 @@ pub async fn view_consent_post( state, code, }) => { - let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ); + let jar = cookies::destroy(jar, COOKIE_OAUTH2_REQ, &server_state); if let Some(redirect) = consent_form.redirect { Ok(( diff --git a/server/core/src/https/views/reset.rs b/server/core/src/https/views/reset.rs index d64b6cdf4..7e6dd55d6 100644 --- a/server/core/src/https/views/reset.rs +++ b/server/core/src/https/views/reset.rs @@ -220,7 +220,7 @@ pub(crate) async fn commit( .await?; // No longer need the cookie jar. - let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN, &state); Ok((jar, HxLocation::from(Uri::from_static("/ui")), "").into_response()) } @@ -241,7 +241,7 @@ pub(crate) async fn cancel_cred_update( .await?; // No longer need the cookie jar. - let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + let jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN, &state); Ok(( jar, @@ -688,7 +688,7 @@ fn add_cu_cookie( cu_session_token: CUSessionToken, ) -> CookieJar { let mut token_cookie = - cookies::make_unsigned(state, COOKIE_CU_SESSION_TOKEN, cu_session_token.token, "/"); + cookies::make_unsigned(state, COOKIE_CU_SESSION_TOKEN, cu_session_token.token); token_cookie.set_same_site(SameSite::Strict); jar.add(token_cookie) } @@ -788,7 +788,7 @@ pub(crate) async fn view_reset_get( | OperationError::InvalidState, ) => { // If our previous credential update session expired we want to see the reset form again. - jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN); + jar = cookies::destroy(jar, COOKIE_CU_SESSION_TOKEN, &state); if let Some(token) = params.token { let token_uri_string = format!("{}?token={}", Urls::CredReset, token); From 3430a1c31daa451350da6e2073bb3ea1a789406a Mon Sep 17 00:00:00 2001 From: Firstyear Date: Sat, 4 Jan 2025 13:09:48 +1000 Subject: [PATCH 40/87] Ignore anonymous in oauth2 read allow access (#3336) Administrators will sometimes configure oauth2 clients with `idm_all_accounts` as an allowed scope group. Despite anonymous being *unable* to interact with oauth2, this still allowed oauth2 clients to be read by anonymous in this configuration. For some users, this may be considered a public info disclosure. --- server/lib/src/server/access/mod.rs | 22 +++++++++++++++++----- server/lib/src/server/access/search.rs | 5 +++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/server/lib/src/server/access/mod.rs b/server/lib/src/server/access/mod.rs index 212b18c98..e57222b40 100644 --- a/server/lib/src/server/access/mod.rs +++ b/server/lib/src/server/access/mod.rs @@ -2964,6 +2964,7 @@ mod tests { let r_set = vec![Arc::new(ev1.clone()), Arc::new(ev2)]; + // Check the authorisation search event, and that it reduces correctly. let se_a = SearchEvent::new_impersonate_entry( E_TEST_ACCOUNT_1.clone(), filter_all!(f_pres(Attribute::Name)), @@ -2971,17 +2972,28 @@ mod tests { let ex_a = vec![Arc::new(ev1)]; let ex_a_reduced = vec![ev1_reduced]; + test_acp_search!(&se_a, vec![], r_set.clone(), ex_a); + test_acp_search_reduce!(&se_a, vec![], r_set.clone(), ex_a_reduced); + + // Check that anonymous is denied even though it's a member of the group. + let anon: EntryInitNew = BUILTIN_ACCOUNT_ANONYMOUS_DL6.clone().into(); + let mut anon = anon.into_invalid_new(); + anon.set_ava_set(&Attribute::MemberOf, ValueSetRefer::new(UUID_TEST_GROUP_1)); + + let anon = Arc::new(anon.into_sealed_committed()); + + let se_anon = + SearchEvent::new_impersonate_entry(anon, filter_all!(f_pres(Attribute::Name))); + let ex_anon = vec![]; + test_acp_search!(&se_anon, vec![], r_set.clone(), ex_anon); + + // Check the deny case. let se_b = SearchEvent::new_impersonate_entry( E_TEST_ACCOUNT_2.clone(), filter_all!(f_pres(Attribute::Name)), ); let ex_b = vec![]; - // Check the authorisation search event, and that it reduces correctly. - test_acp_search!(&se_a, vec![], r_set.clone(), ex_a); - test_acp_search_reduce!(&se_a, vec![], r_set.clone(), ex_a_reduced); - - // Check the deny case. test_acp_search!(&se_b, vec![], r_set, ex_b); } diff --git a/server/lib/src/server/access/search.rs b/server/lib/src/server/access/search.rs index 023cc099c..96e30a86b 100644 --- a/server/lib/src/server/access/search.rs +++ b/server/lib/src/server/access/search.rs @@ -168,6 +168,11 @@ fn search_oauth2_filter_entry(ident: &Identity, entry: &Arc AccessResult::Ignore, IdentType::User(iuser) => { + if iuser.entry.get_uuid() == UUID_ANONYMOUS { + debug!("Anonymous can't access OAuth2 entries, ignoring"); + return AccessResult::Ignore; + } + let contains_o2_rs = entry .get_ava_as_iutf8(Attribute::Class) .map(|set| { From b74883ae0d30b86730b377e7d18259e85f9e9fcb Mon Sep 17 00:00:00 2001 From: James Hodgkinson Date: Sat, 4 Jan 2025 15:25:46 +1000 Subject: [PATCH 41/87] Javascript linting (#3329) * feat(ci/dev): adding npm/eslint config for javascript linting * feat(ci/dev): adding js-prettier config for consistency in formatting * fix(css): linting * fix(js): linting the js things --- .editorconfig | 12 + .github/workflows/javascript_lint.yml | 21 + .gitignore | 3 + Makefile | 31 +- server/core/eslint.config.mjs | 16 + server/core/package-lock.json | 1104 ++++++++++++++++++++ server/core/package.json | 27 + server/core/prettier-ignore | 1 + server/core/static/modules/cred_update.mjs | 95 +- server/core/static/pkhtml.js | 70 +- server/core/static/style.css | 16 +- 11 files changed, 1323 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/javascript_lint.yml create mode 100644 server/core/eslint.config.mjs create mode 100644 server/core/package-lock.json create mode 100644 server/core/package.json create mode 100644 server/core/prettier-ignore diff --git a/.editorconfig b/.editorconfig index 7eb6f3702..c918945cc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,9 +2,21 @@ root = true + + [*.md] charset = utf-8 end_of_line = lf indent_size = 2 max_line_length = 100 trim_trailing_whitespace = true + +[*.js] +tab_width = 4 +max_line_length = 120 +print_width = 120 + +[*.mjs] +tab_width = 4 +max_line_length = 120 +print_width = 120 \ No newline at end of file diff --git a/.github/workflows/javascript_lint.yml b/.github/workflows/javascript_lint.yml new file mode 100644 index 000000000..94081c99c --- /dev/null +++ b/.github/workflows/javascript_lint.yml @@ -0,0 +1,21 @@ +--- +name: Javascript Linting +"on": + - push + - pull_request +jobs: + javascript_lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Run ESLint to check Javascript files + run: + make eslint + javascript_fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Run Prettier to check Javascript files + run: + make prettier + diff --git a/.gitignore b/.gitignore index e3f702e83..caf09b333 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ scripts/oauth_proxy/envfile # IDEs .idea/ .vscode/ + +# javascript test things +node_modules/ \ No newline at end of file diff --git a/Makefile b/Makefile index bff9bbef9..ec11d2bb4 100644 --- a/Makefile +++ b/Makefile @@ -325,4 +325,33 @@ coverage: ## Run the coverage tests using cargo-tarpaulin coveralls: ## Run cargo tarpaulin and upload to coveralls coveralls: cargo tarpaulin --coveralls $(COVERALLS_REPO_TOKEN) - @echo "Coveralls repo information is at https://coveralls.io/github/kanidm/kanidm" \ No newline at end of file + @echo "Coveralls repo information is at https://coveralls.io/github/kanidm/kanidm" + + +.PHONY: eslint +eslint: ## Run eslint on the UI javascript things +eslint: eslint/setup + @echo "################################" + @echo " Running eslint..." + @echo "################################" + cd server/core && find ./static -name '*js' -not -path '*/external/*' -exec eslint "{}" \; + @echo "################################" + @echo "Done!" + +.PHONY: eslint/setup +eslint/setup: ## Install eslint for the UI javascript things + cd server/core && npm ci + +.PHONY: prettier +prettier: ## Run prettier on the UI javascript things +prettier: eslint/setup + @echo " Running prettier..." + cd server/core && npm run prettier + @echo "Done!" + +.PHONY: prettier/fix +prettier/fix: ## Run prettier on the UI javascript things and write back changes +prettier/fix: eslint/setup + @echo " Running prettier..." + cd server/core && npm run prettier:fix + @echo "Done!" \ No newline at end of file diff --git a/server/core/eslint.config.mjs b/server/core/eslint.config.mjs new file mode 100644 index 000000000..9b37c4f68 --- /dev/null +++ b/server/core/eslint.config.mjs @@ -0,0 +1,16 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { + languageOptions: { + globals: { + ...globals.browser, + Base64 : "writeable" // to feed the Base64 class into the global scope + } + } + }, + pluginJs.configs.recommended, +]; \ No newline at end of file diff --git a/server/core/package-lock.json b/server/core/package-lock.json new file mode 100644 index 000000000..ca6a32c48 --- /dev/null +++ b/server/core/package-lock.json @@ -0,0 +1,1104 @@ +{ + "name": "kanidm", + "version": "0.0.1-dev", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kanidm", + "version": "0.0.1-dev", + "license": "MPL-2.0", + "devDependencies": { + "@eslint/js": "^9.17.0", + "eslint": "^9.17.0", + "globals": "^15.14.0", + "prettier": "^3.4.2" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.17.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/server/core/package.json b/server/core/package.json new file mode 100644 index 000000000..7d07819de --- /dev/null +++ b/server/core/package.json @@ -0,0 +1,27 @@ +{ + "name": "kanidm", + "version": "0.0.1-dev", + "description": "Kanidm UI Javascript - not a publishable package, just for development", + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/kanidm/kanidm.git" + }, + "author": "", + "license": "MPL-2.0", + "bugs": { + "url": "https://github.com/kanidm/kanidm/issues" + }, + "homepage": "https://kanidm.com", + "devDependencies": { + "@eslint/js": "^9.17.0", + "eslint": "^9.17.0", + "globals": "^15.14.0", + "prettier": "^3.4.2" + }, + "scripts" : { + "prettier": "npx prettier --ignore-path 'prettier-ignore' ./static --check", + "prettier:fix": "npx prettier --ignore-path 'prettier-ignore' ./static --write" + } + +} diff --git a/server/core/prettier-ignore b/server/core/prettier-ignore new file mode 100644 index 000000000..4c6d04fa5 --- /dev/null +++ b/server/core/prettier-ignore @@ -0,0 +1 @@ +static/external/ \ No newline at end of file diff --git a/server/core/static/modules/cred_update.mjs b/server/core/static/modules/cred_update.mjs index 701cc8ec0..e794fb3ad 100644 --- a/server/core/static/modules/cred_update.mjs +++ b/server/core/static/modules/cred_update.mjs @@ -1,4 +1,4 @@ -console.debug('credupdate: loaded'); +console.debug("credupdate: loaded"); // Makes the password form interactive (e.g. shows when passwords don't match) function setupInteractivePwdFormListeners() { @@ -18,10 +18,10 @@ function setupInteractivePwdFormListeners() { pwd_submit.disabled = true; } - new_pwd.addEventListener("input", (_) => { + new_pwd.addEventListener("input", () => { // Don't mark invalid if user didn't fill in the confirmation box yet - // Also my password manager (keepassxc with autocomplete) - // likes to fire off input events when both inputs were empty. + // Also KeepassXC with autocomplete likes to fire off input events when + // both inputs are empty. if (new_pwd_check.value !== "") { if (new_pwd.value === new_pwd_check.value) { markPwdCheckValid(); @@ -32,7 +32,7 @@ function setupInteractivePwdFormListeners() { new_pwd.classList.remove("is-invalid"); }); - new_pwd_check.addEventListener("input", (_) => { + new_pwd_check.addEventListener("input", () => { // No point in updating the status if confirmation box is empty if (new_pwd_check.value === "") return; if (new_pwd_check.value === new_pwd.value) { @@ -43,38 +43,44 @@ function setupInteractivePwdFormListeners() { }); } -window.stillSwapFailureResponse = function(event) { +window.stillSwapFailureResponse = function (event) { if (event.detail.xhr.status === 422 || event.detail.xhr.status === 500) { - console.log("Still swapping failure response") + console.debug(`Got HTTP/${event.detail.xhr.status}, still swapping failure response`); event.detail.shouldSwap = true; event.detail.isError = false; } -} +}; function onPasskeyCreated(assertion) { try { - console.log(assertion) + console.log(assertion); let creationData = {}; creationData.id = assertion.id; - creationData.rawId = Base64.fromUint8Array(new Uint8Array(assertion.rawId)) + creationData.rawId = Base64.fromUint8Array(new Uint8Array(assertion.rawId)); creationData.response = {}; - creationData.response.attestationObject = Base64.fromUint8Array(new Uint8Array(assertion.response.attestationObject)) - creationData.response.clientDataJSON = Base64.fromUint8Array(new Uint8Array(assertion.response.clientDataJSON)) - creationData.type = assertion.type - creationData.extensions = assertion.getClientExtensionResults() - creationData.extensions.uvm = undefined + creationData.response.attestationObject = Base64.fromUint8Array( + new Uint8Array(assertion.response.attestationObject), + ); + creationData.response.clientDataJSON = Base64.fromUint8Array(new Uint8Array(assertion.response.clientDataJSON)); + creationData.type = assertion.type; + creationData.extensions = assertion.getClientExtensionResults(); + creationData.extensions.uvm = undefined; // Put the passkey creation data into the form for submission - document.getElementById("passkey-create-data").value = JSON.stringify(creationData) + document.getElementById("passkey-create-data").value = JSON.stringify(creationData); // Make the name input visible and hide the "Begin Passkey Enrollment" button - document.getElementById("passkeyNamingSafariPre").classList.add("d-none") - document.getElementById("passkeyNamingForm").classList.remove("d-none") - document.getElementById("passkeyNamingSubmitBtn").classList.remove("d-none") + document.getElementById("passkeyNamingSafariPre").classList.add("d-none"); + document.getElementById("passkeyNamingForm").classList.remove("d-none"); + document.getElementById("passkeyNamingSubmitBtn").classList.remove("d-none"); } catch (e) { - console.log(e) - if (confirm("Failed to encode your new passkey's data for transmission, confirm to reload this page.\nReport this issue if it keeps occurring.")) { + console.log(e); + if ( + confirm( + "Failed to encode your new passkey's data for transmission, confirm to reload this page.\nReport this issue if it keeps occurring.", + ) + ) { window.location.reload(); } } @@ -82,36 +88,41 @@ function onPasskeyCreated(assertion) { function startPasskeyEnrollment() { try { - const data_elem = document.getElementById('data'); + const data_elem = document.getElementById("data"); const credentialRequestOptions = JSON.parse(data_elem.textContent); - credentialRequestOptions.publicKey.challenge = Base64.toUint8Array(credentialRequestOptions.publicKey.challenge); + credentialRequestOptions.publicKey.challenge = Base64.toUint8Array( + credentialRequestOptions.publicKey.challenge, + ); credentialRequestOptions.publicKey.user.id = Base64.toUint8Array(credentialRequestOptions.publicKey.user.id); - console.log(credentialRequestOptions) - navigator.credentials - .create({publicKey: credentialRequestOptions.publicKey}) - .then((assertion) => { + console.log(credentialRequestOptions); + navigator.credentials.create({ publicKey: credentialRequestOptions.publicKey }).then( + (assertion) => { onPasskeyCreated(assertion); - }, (reason) => { - alert("Passkey creation failed " + reason.toString()) - console.log("Passkey creation failed: " + reason.toString()) - }); + }, + (reason) => { + alert(`Passkey creation failed ${reason.toString()}`); + console.log(`Passkey creation failed: ${reason.toString()}`); + }, + ); } catch (e) { - console.log(e) - if (confirm("Failed to initialize passkey creation, confirm to reload this page.\nReport this issue if it keeps occurring.")) { + console.log(`Failed to initialize passkey creation: ${e}`); + if ( + confirm( + "Failed to initialize passkey creation, confirm to reload this page.\nReport this issue if it keeps occurring.", + ) + ) { window.location.reload(); } } } function setupPasskeyNamingSafariButton() { - document.getElementById("passkeyNamingSafariBtn") - .addEventListener("click", startPasskeyEnrollment) + document.getElementById("passkeyNamingSafariBtn").addEventListener("click", startPasskeyEnrollment); } function setupSubmitBtnVisibility() { - document.getElementById("passkey-label") - ?.addEventListener("input", updateSubmitButtonVisibility) + document.getElementById("passkey-label")?.addEventListener("input", updateSubmitButtonVisibility); } function updateSubmitButtonVisibility(event) { @@ -119,12 +130,14 @@ function updateSubmitButtonVisibility(event) { submitButton.disabled = event.value === ""; } -(function() { - console.debug('credupdate: init'); - document.body.addEventListener("addPasswordSwapped", () => { setupInteractivePwdFormListeners() }); +(function () { + console.debug("credupdate: init"); + document.body.addEventListener("addPasswordSwapped", () => { + setupInteractivePwdFormListeners(); + }); document.body.addEventListener("addPasskeySwapped", () => { setupPasskeyNamingSafariButton(); startPasskeyEnrollment(); setupSubmitBtnVisibility(); }); -})() +})(); diff --git a/server/core/static/pkhtml.js b/server/core/static/pkhtml.js index 3cff9f8fc..14ec25ac3 100644 --- a/server/core/static/pkhtml.js +++ b/server/core/static/pkhtml.js @@ -1,29 +1,45 @@ +/** + * Initiates the passkey login process by requesting credentials from the user. + * + * This function retrieves the credential request options from the DOM, converts + * necessary fields from Base64 to Uint8Array, and then uses the Web Authentication API + * to get the user's credentials. Upon successful retrieval, it encodes the assertion + * response back to Base64 and submits the form with the credential data. + * + * @function asskey_login + * @throws {Error} If the passkey authentication process fails. + */ function asskey_login() { - let credentialRequestOptions = JSON.parse(document.getElementById('data').textContent); + let credentialRequestOptions = JSON.parse(document.getElementById("data").textContent); credentialRequestOptions.publicKey.challenge = Base64.toUint8Array(credentialRequestOptions.publicKey.challenge); credentialRequestOptions.publicKey.allowCredentials?.forEach(function (listItem) { - listItem.id = Base64.toUint8Array(listItem.id) + listItem.id = Base64.toUint8Array(listItem.id); }); - navigator.credentials.get({ publicKey: credentialRequestOptions.publicKey }) - .then((assertion) => { - document.getElementById("cred").value = JSON.stringify({ - id: assertion.id, - rawId: Base64.fromUint8Array(new Uint8Array(assertion.rawId), true), - type: assertion.type, - response: { - authenticatorData: Base64.fromUint8Array(new Uint8Array(assertion.response.authenticatorData), true), - clientDataJSON: Base64.fromUint8Array(new Uint8Array(assertion.response.clientDataJSON), true), - signature: Base64.fromUint8Array(new Uint8Array(assertion.response.signature), true), - userHandle: Base64.fromUint8Array(new Uint8Array(assertion.response.userHandle), true) - }, + navigator.credentials + .get({ publicKey: credentialRequestOptions.publicKey }) + .then((assertion) => { + document.getElementById("cred").value = JSON.stringify({ + id: assertion.id, + rawId: Base64.fromUint8Array(new Uint8Array(assertion.rawId), true), + type: assertion.type, + response: { + authenticatorData: Base64.fromUint8Array( + new Uint8Array(assertion.response.authenticatorData), + true, + ), + clientDataJSON: Base64.fromUint8Array(new Uint8Array(assertion.response.clientDataJSON), true), + signature: Base64.fromUint8Array(new Uint8Array(assertion.response.signature), true), + userHandle: Base64.fromUint8Array(new Uint8Array(assertion.response.userHandle), true), + }, + }); + document.getElementById("cred-form").submit(); + }) + .catch((error) => { + console.error(`Failed to complete passkey authentication: ${error}`); + throw error; }); - document.getElementById("cred-form").submit(); - }).catch((error) => { - console.error(`Failed to complete passkey authentication: ${error}`); - throw error; - }); } try { @@ -31,17 +47,23 @@ try { myButton.addEventListener("click", () => { asskey_login(); }); -} catch (_error) {}; +} catch (error) { + console.error(`Failed to add button event listener for passkey authentication: ${error}`); +} try { const myButton = document.getElementById("start-seckey-button"); myButton.addEventListener("click", () => { asskey_login(); }); -} catch (_error) {}; +} catch (error) { + console.error(`Failed to add button event listener for security key authentication: ${error}`); +} try { - window.addEventListener("load", (event) => { - asskey_login() + addEventListener("load", () => { + asskey_login(); }); -} catch (_error) {}; +} catch (error) { + console.error(`Failed to add load-time event listener for passkey authentication: ${error}`); +} diff --git a/server/core/static/style.css b/server/core/static/style.css index dde40bb11..577a79909 100644 --- a/server/core/static/style.css +++ b/server/core/static/style.css @@ -30,14 +30,15 @@ body { .side-menu-item { --icon-size: 24px; - padding: .4rem .7rem; + padding: 0.4rem 0.7rem; text-decoration: none; &.active { font-weight: 600; } - &:hover, &.active { + &:hover, + &.active { background-color: var(--bs-gray-300); } @@ -53,7 +54,6 @@ body { * Personal Settings sidemenu */ - /* * Navbar */ @@ -80,7 +80,9 @@ body { margin: auto; border-radius: 15px; background: #21252915; - box-shadow: -5px -5px 11px #ededed, 5px 5px 11px #ffffff; + box-shadow: + -5px -5px 11px #ededed, + 5px 5px 11px #ffffff; margin: 15px; } @@ -150,9 +152,9 @@ body { } .btn-tiny { - --bs-btn-padding-y: .05rem; - --bs-btn-padding-x: .4rem; - --bs-btn-font-size: .75rem; + --bs-btn-padding-y: 0.05rem; + --bs-btn-padding-x: 0.4rem; + --bs-btn-font-size: 0.75rem; } #cred-update-commit-bar { From 761dda688e9ae1b9a4edc7cdc5b602e7ef07bb36 Mon Sep 17 00:00:00 2001 From: Firstyear Date: Mon, 6 Jan 2025 15:58:40 +1000 Subject: [PATCH 42/87] Fix /var/run/kanidm-unixd permission (#3342) This folder was set to 750 which prevented non-root users from reading the localhost unixd socket which is required for nss/pam to operate. --- platform/freebsd/client/pkg-plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/freebsd/client/pkg-plist b/platform/freebsd/client/pkg-plist index a4cc43986..dae0fd306 100644 --- a/platform/freebsd/client/pkg-plist +++ b/platform/freebsd/client/pkg-plist @@ -10,4 +10,4 @@ libexec/kanidm_unixd_tasks @dir /var/lib @dir(_kanidm_unixd,_kanidm_unixd,750) /var/cache/kanidm-unixd @dir(_kanidm_unixd,_kanidm_unixd,750) /var/lib/kanidm-unixd -@dir(_kanidm_unixd,_kanidm_unixd,750) /var/run/kanidm-unixd +@dir(_kanidm_unixd,_kanidm_unixd,755) /var/run/kanidm-unixd From a3358828a8b28db93473b6067d37ec2422f08b15 Mon Sep 17 00:00:00 2001 From: George Wu Date: Mon, 6 Jan 2025 02:58:42 -0800 Subject: [PATCH 43/87] Add support for prefers-color-scheme using Bootstrap classes. (#3327) * Add support for prefers-color-scheme using Bootstrap classes. * Move stylesheet changes to separate javascript file. * fix(html): don't specify the integrity hash in the tag for style.js * fix(log): debug-log integrity hashes for troubleshooting * fix(css): move to using bootstrap standard variables for colours and theming * fix(js): rewrite to simplify and use standard bootstrap functionality * fix(makefile): codespell thingie was complaining * run prettier on css/js. --------- Co-authored-by: James Hodgkinson --- Makefile | 5 ++-- server/core/src/https/mod.rs | 2 ++ server/core/static/style.css | 27 +++++++++++++++---- server/core/static/style.js | 19 +++++++++++++ server/core/templates/apps_partial.html | 2 +- server/core/templates/base.html | 5 +++- server/core/templates/base_htmx.html | 5 +++- .../templates/credentials_update_partial.html | 2 +- server/core/templates/login.html | 2 +- server/core/templates/login_backupcode.html | 2 +- server/core/templates/login_mech_choose.html | 2 +- server/core/templates/login_password.html | 2 +- server/core/templates/login_totp.html | 2 +- server/core/templates/login_webauthn.html | 4 +-- server/core/templates/navbar.html | 2 +- .../core/templates/oauth2_device_login.html | 2 +- .../templates/user_settings_partial_base.html | 2 +- 17 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 server/core/static/style.js diff --git a/Makefile b/Makefile index ec11d2bb4..cd3f8e896 100644 --- a/Makefile +++ b/Makefile @@ -178,9 +178,8 @@ codespell: --skip='*.svg' \ --skip='*.br' \ --skip='./rlm_python/mods-available/eap' \ - --skip='./server/lib/src/constants/system_config.rs' - --skip='./pykanidm/site' \ - --skip='./server/lib/src/constants/*.json' + --skip='./server/lib/src/constants/system_config.rs' \ + --skip='./pykanidm/site' .PHONY: test/pykanidm/pytest test/pykanidm/pytest: ## python library testing diff --git a/server/core/src/https/mod.rs b/server/core/src/https/mod.rs index 6b8e34cdd..049c62e00 100644 --- a/server/core/src/https/mod.rs +++ b/server/core/src/https/mod.rs @@ -140,11 +140,13 @@ pub(crate) fn get_js_files(role: ServerRole) -> Result, ()> "external/base64.js", "modules/cred_update.mjs", "pkhtml.js", + "style.js", ]; for filepath in filelist { match generate_integrity_hash(format!("{}/{}", pkg_path, filepath,)) { Ok(hash) => { + debug!("Integrity hash for {}: {}", filepath, hash); let js = JavaScriptFile { hash }; all_pages.push(js) } diff --git a/server/core/static/style.css b/server/core/static/style.css index 577a79909..fe4c1c0b4 100644 --- a/server/core/static/style.css +++ b/server/core/static/style.css @@ -39,7 +39,7 @@ body { &:hover, &.active { - background-color: var(--bs-gray-300); + background-color: var(--bs-tertiary-bg); } .icon-container img { @@ -57,6 +57,23 @@ body { /* * Navbar */ +nav.kanidm_navbar { + background-color: var(--bs-navbar-brand-color); +} + +nav a.navbar-brand, +nav a.nav-link { + color: var(--bs-body-bg); +} + +nav a.navbar-brand:hover, +nav a.nav-link:hover { + color: var(--bs-secondary-bg); +} + +footer { + background-color: var(--bs-tertiary-bg); +} .kanidm_logo { width: 12em; @@ -79,7 +96,7 @@ body { align-items: center; margin: auto; border-radius: 15px; - background: #21252915; + background-color: #21252915; box-shadow: -5px -5px 11px #ededed, 5px 5px 11px #ffffff; @@ -122,15 +139,15 @@ body { } .totp-timer__path-remaining.green { - color: rgb(65, 184, 131); + color: var(--bs-success); } .totp-timer__path-remaining.orange { - color: orange; + color: var(--bs-warning); } .totp-timer__path-remaining.red { - color: red; + color: var(--bs-danger); } .totp-timer__path-remaining.no-transition { diff --git a/server/core/static/style.js b/server/core/static/style.js new file mode 100644 index 000000000..bb11c201a --- /dev/null +++ b/server/core/static/style.js @@ -0,0 +1,19 @@ +/** Queries the user's preferred colour scheme and returns the appropriate value. + From https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript +*/ +function getPreferredTheme() { + return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; +} + +/** Sets the theme. + */ +function updateColourScheme() { + const theme = getPreferredTheme(); + console.debug(`updateColourScheme theme->${theme}`); + document.documentElement.setAttribute("data-bs-theme", theme); +} + +updateColourScheme(); +window.matchMedia("(prefers-color-scheme: light)").addEventListener("change", updateColourScheme); +window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", updateColourScheme); +document.body.addEventListener("htmx:afterOnLoad", updateColourScheme); diff --git a/server/core/templates/apps_partial.html b/server/core/templates/apps_partial.html index 4bad4f153..1e63e5682 100644 --- a/server/core/templates/apps_partial.html +++ b/server/core/templates/apps_partial.html @@ -13,7 +13,7 @@ (% match app %) (% when AppLink::Oauth2 with { name, display_name, redirect_url, has_image } %) - + (% if has_image %) ((display_name)) icon diff --git a/server/core/templates/base.html b/server/core/templates/base.html index cef017ee4..30a4b19d4 100644 --- a/server/core/templates/base.html +++ b/server/core/templates/base.html @@ -15,6 +15,9 @@ + @@ -22,7 +25,7 @@ (% block body %)(% endblock %) -