From c959ca4574e1f1b7b264c858ed3e2713ff58c1ce Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Mon, 7 Sep 2026 08:52:24 +0200 Subject: [PATCH 1/3] feat(frontend): add SAML helper (#12799) * squash #12762 * implement https://github.com/inventree/InvenTree/issues/3509 * add changelog * add option to use the full width --- CHANGELOG.md | 1 + .../assets/images/settings/sso_settings.png | Bin 167349 -> 0 bytes docs/docs/settings/SSO.md | 58 ++- .../InvenTree/InvenTree/api_version.py | 5 +- src/backend/InvenTree/InvenTree/metadata.py | 1 + src/backend/InvenTree/InvenTree/settings.py | 20 +- src/backend/InvenTree/common/api.py | 88 +++++ src/backend/InvenTree/common/test_api.py | 96 +++++ src/frontend/lib/enums/ApiEndpoints.tsx | 1 + src/frontend/lib/types/Forms.tsx | 3 +- src/frontend/lib/types/Tables.tsx | 2 + .../components/forms/fields/ApiFormField.tsx | 10 + .../src/components/forms/fields/JsonField.tsx | 75 ++++ .../tables/InvenTreeTableHeader.tsx | 20 +- .../AdminCenter/IdentityManagementPanel.tsx | 362 +++++++++++++++++- 15 files changed, 692 insertions(+), 50 deletions(-) delete mode 100644 docs/docs/assets/images/settings/sso_settings.png create mode 100644 src/frontend/src/components/forms/fields/JsonField.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ab2ce5752..0551bee7ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [#12713](https://github.com/inventree/InvenTree/pull/12713) adds SCIM 2 provisioning support, allowing InvenTree to be integrated with external identity providers for user management. +- [#12731](https://github.com/inventree/InvenTree/pull/12731) adds OIDC provider settings to the Admin Center - making all Identity Federation settings now available in one place without the need to use the database admin interface. ### Changed diff --git a/docs/docs/assets/images/settings/sso_settings.png b/docs/docs/assets/images/settings/sso_settings.png deleted file mode 100644 index d13b2b2da8dba9de14326e294af833f3ab0cffc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167349 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%0A)KM+ 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�)a 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
    keZ_gCoREdS%n#RrFmhDJw?ArKIDB096;u5;9= z;D{2Rh z4;!W;$YHd8dxVC8x%Mmj*ZztdI8^K*Za%=vtz7P_7!7PDI&L6Qssv zF$$L7JI~+d-F9We>yQoosMLiYJ#l`q`h%Fd5dDg}psf@`(sVaxdlEH3rBI`I?cE=8 zm?0DEl-;IZe_NH7mZtXzl5GYcZ(>qXXYe->-7x`^b2KwCwQ{z9JE%X)suCxGK7T&9 zk+EDG^N+wQbT~%Z*a{7D;$d}DM4)&xZ$7u}(>>f^sMC#Gf3qqPr(>F%So}>dGpbA6 zjYN1k-l#t(3Vx7sndU{$r^0-+gINzTQWdQE3~BkzN7!VL@TxUv_d5I@%iY za>B&V*k}03J`vULlm_LJWf!>4Qk=&ETpb!?rZdFtW)**myA9R_NnXOJ%*!d&rXN*n zZ!fK^DERNLJgg?ov&~eUplA#G#-l+KacZB|>t(R{y;nl%^D20kwh|T@H zqjOm-1OsCGz(!MY*AO9FaPzregD38XAcB=nbk)D9RB++==Atl@OkRc1L;2!-N1&DR z+&)rUS0phJPkpg7AI&PnUSl(L(ZhZWAA1?GtMpj$s@N(Rk|Mdm%>*U3R;JQam&#n_ zS~u|gPRogq#o%u5FXI9uqyLyFzm{EEs>47w85$oK9@?c1*k8&5LkZc3ae-04l^@H` z&$rcCVxqlVIjbnf{TD+0)z0e#VgmVOJc8_(Y;39q3h0yrN5V{)Q^q@3`#sA)3b5rK zNCONDJKw^-XzdMic-nV$9{HN`D_>!jCK&dFX6oZZTlma-j!dz+ znpk%@5w12qIx5Jz>kK7MtS&F_6OhDZJYMsS!Q;dH%IN=}Osep=Bl80S>V0eM6@Y&JnXU0PTBH16!JZSg1cSx11U*>@p{v`{~g)WZr zatGS}U*{wS|Ce(PD+(XkW#?T;gDju3Gi(2bR>QDNk=TpJU1ogL&JNa;!&J0@HBDU~ zdnV?1T`HwFqvT6FZMLwrE?BbX-Vv|RoVE#od;GWQ6RwvMLkY$2G}|Z4^W)EHL0zWJyVG)& z#h8ExO%-3yfQKJ! zS>I>N=ncD-8$ z@1!}L5)i=6Lu7LNEDJoY-75@Dxwo$}LNWUWxY|6a?9Jcs5Y{?l(sJp%iX180j#W1x z&X%JTWudM{?HBN!?>n^9$*gsMoRsLaE-~rN{K-Oye{u2=h=cRvWOkC%);)AbkFN@C{P5ub30K zoTuehj^8j4-t=(R4v*J7F+vr!m-j9&y}CtNSKV^nmUDK~(`mK1mE~PRsgBaXfF^qS zIfive(xwV!gaJ0cy%B($J1$745hrX|StqjNE2=s8G_R!?eK+j`8ZA@R$v+XOV5#5d zfLDFsK8Il1*LB+}=NSK@MV|AuOxdTpj0A&54`$wEdHcVtg|K=yK?NrQzoByu23XAk z;n@;vYslxygYYb9p1)dJ<-&)1l%^?4LnFsR^{glp37R%syb;$ZB)>!9`P#s^KdS)+ zNs?5SCc0EJ(NCuRyhspv!|JCsdmeny-mMe(bn1g8XUE|u^OUe=6sO6eI%sG6^pW{n z896#Snwgn-c$AtB4L#wC9oED?bWsimuJw@muz@&_yY5eSGnj(C?nTe7!}ztP0tgwI5zB2e zyypc1ZsbO7x6sNMxas+*AYa6XLGsRld0XM%a#o){=<71lHrY+lGBP?u3Flz75mkj~ zC%8Ho=;rB*vVIHMQoWN(B-#N zpH>yA)U6^NWU?JjdCK=LyE!FVs8ZmyKpI@#L5k5x0{jRH)8xU&6` z$+SCD-Q6D;)EC(w)WAMhPmn4)=$*2BX{$XyJ$nbOc}Uo5Z-l7bC)LLkRi0+v7M+6U zyhd+XLZXf&ek*n#18YS5nib z``<(WJ`%Yg|LTGc-^r2>fP8(wEyvh>G$$>>Lo0&VP{NrSS0Sr#pC2FG4d9J1XC*fg zIS0S&S)jyH)b7w;(YTZ7HpJ+*8s?a=D*A@}d{3Q`aR0%r0<$$!B7+(sH|?ZqB;eoA zoI1=_mc-6fH9b^AVBp2_T9kfV#)KFEAF zvK6vn{>|w<&VP}pR4jlCrz7u@2@zdY8V8ncZ7a#+ORl<7W*?A?j*2x}`-!O@)t3iR z3mPV6Q_oB)OJm@e4pA7oEWTIl+&9iqJ4iLiS?$~8RTJ}bzTw6)igqGtU|542c|5O< zIE|oZ>f3qLj%~@E_!;#y5;_hU2~Lk|it^hT>V;-MFi_`$ zcwbw0SvISU6YW9T5O99qUDC&$aPYJ*d2&paiQvw#$7J0sj1O8V<@_e zLqbUeGaXP@cul_Xt31c5kM*Gg=vMP%-({~6U;K?QejLhTdx1roJh^?N0RrlnMuPiu zz^6zx8Snwu8qF_d&SE_}H7}9!{bi2bN^HAl%7NeaBuyBs25R{%R-a$67K5@G7?>$i z%!qHC74b)y@rv8&Z?PJHUn7vou<*V+)Y=PiN(J6cq2)roy04PAF!BgM+ z(RES}G$k*lXwQz1Q287nD#c39tpe)k05?izAuLC(fu?3M}+vy!79NLN&d zZsfc$R2tQF=E?I_p-p=}EW_Pj&1g;3_Oq^Z%gemmk=^9o^6HI|YG?#X>p#JIi z6cJYDs>_!s?|nsJ>N{eE8HPZUYyGtQv=sCHhW2XFYo!vl)i;~R13l+{Cwiw&e9GON zFHr3Mkc5JW^x7L2ng%O}4{zDy%O-%61%l(J#_b4z@vY%UX{}pSq zhNcm^5h0q(r)D{B{WHa|x}Lw9Fbk)k5e$rbs`qF6gijE}*FV=ZIJ_$qb>fo`06-kp z!zPEMk4~bw+?jmm)jPD3$m%hsECF{Qhk~W=!Plz9-R8I$3{Mz=$P2Ar)Wr|JDY=vK zp^j~j`(_&BLkCj%0@{X_p2*7Vb!xyiIpK$|0Zwj0IM<4&z<3D8j4wV2&l98-g9(Lt z1vNLCB)WAA?!S}<*ytXwY`*R{dFK5_6kzq*a%tUd;GY=cYM+2yKh3Ld`-soQFEFP3 z*xuO6?`n!GzdNAF&xk(HaJu@7q6aqSd^_ibm*4lrU5eD;(Ls2nKHy)qt~>6!f^d<`#V``00Jm6T&It#l*^uGr-iBnW(op zrZ+m2VSuBe0Jr!7g)-K38w%57seSw`Ue{l71}KxLOJGrq%n}!G>le|T*YDU~ngGSi z>8wCX6-%dvb}sF;VLyr&s|P}$c2NAf$|;hbp6K%dXD0XwvS8IOyIu!cuLIi5WjmLa zns{qa7IXJ>PI%{wxQUFzt4v{2@=85(?41&~OA5tSCIX1N&w-wyP9^OJs5iC-i^pxI z$9s#s9^^}uNiEt$jmT|BaEQHn73_IzF3C7Lf4t~;Ix2PTdh9Bf-g9QEIEaZqpt-(< zpu^cww6=U8dUrZN2OM0mJViR+q?30@9U-cmydUwWDB-6PmI~7~jmkv)7ESwJcZK>0 zwpT7O;xbArEo}8#e=06WYZ{btwx@84r+WzANwvMhslStEH`zlOmxG>*_;{|5jSPHQ~g1FBM{YxgaH}$diGMGae&VqE_NQ&y72!6%uL8Auzvm-R9AP z>s*Fo0J;HTlbDy<^YRsg-{Eyi|5@TR@(UagsuIG6QVeOJn|MU8>%e^j2?#T!&Z?D5 zAQY=X`qNbJjpJqJS8vRJ^D3>RXiyAJRp`biu*_*wfLyO5&0u2tKOmnihmwC)mmVK= zDJ#vBYd7HA_D5!V1|2?q@(tJtnwb~1wEqR+TQ=FBNs0~zN*EslZ7mZ_Npo zIv^$?pw5^Ruc@7UI7`X2URWa9WU}NGdm;70GL z8TOq|S^JU?$h&vx;NmTHH^L{+>s0G~ybkPfgBjkDk~Pd2D-R? z=eMWLwHN!8mK=`?hBVDQeUvz%eQzNWwK_zelXE`6rjX|8)%TTk|3=>>H5x0N#>3%4 zE9_3gZAX=D*LPqC7XT2IYW*n^SwJLQNrM8TWfm0_Tqxv1d{`%60lwXt-Iga)+vg^6 z9kRe07nh)~zY0l6`^f1fp!f$WPX>4|kv?B^{BIW5P6P~{wvfm*W@?aF2sS+}8FLTi|z}uiY#w$D7M&xg&2MSUkSczD-}_Fmh3=R(W8Q8nTfIx``_( zobrT0p_ORO4zorMl`KD>Pw2)xUx)P`T~5ktz~EMjR~>T;jhD9gxIp$r}vm`o%J?K|*mrik&sDrmJ z4L!n5^(ra#+)3*wp?2Koi}c~R$6g}tRujVO`AT9mtcumAW9(il+$*r=d+ixzao9*O zM~GH3obNZIQiwnBgJDpB#Cll=0IpPzZKoBK5YDs@1Ua&+$s8BT)z-9MP`cNfjg@n5M`y-gnm zeQL}q2N7@TyPTP}|8u4(spYX3s&3f*# zQ+!sr!Z?r=dcIUMsMo%DC}AnsZFXic!91vha=Yges#fP9f{DC!>x8Ap@U{xkp(K%g z*(g((FqZP3H7uD@LzO?BKv)lDG53nwM%M99a%;?L{5Yq}~bDnN|`fF?(Hr4WraCk07l4PL`v5p^IBP;%hWsN*l(ZciNh zU-dUYfF+X=ckqIdT}Ot8@X02u0fo26rAL)G>X?S^(Ur@RL;AaY29hw1kt*OHt3(+{ z9Hx9Kh1Dfbq0@r!y9mRA4185VLN4=Q0?+*uoIt^@{%QG5v5BVpBwR-Ei62FZB`6lLq2F-{aQ#W@Po`m6jJ ztSZ9L9=nn5wfX%_6mkc;uDtE5PAGZx*?HI_lV%nChxm{$O8ghA^7E5YO9zSI zKwWk#+uN0lGPf8v$SPZ;9sWPe{byWL+4lzuV;==XML0RkP)I6gHgHQ}sICw23R$ld9>uyX1f~_lU^vh=yJtfC6cU z0EL3C2?ss&+gcDne0CBnqK>I@;z@n>RJyIcR_zG}{%J$~bFTOF+=32A9T?45^is?1 zu4!M#*Ut$Y9<%i#J6cw?aX{dtTqQhexn~|BiYiietFxE7&juM%^Y0Qky|Lw*W;3Eu z`NvcF8!6yMnsO9I6;srFzd)ZZoMcU_Kw1Uz3HQtP;qS-6fZmc%V^v5n2xu$e$_v-c z)uk+Nt!~!67Wm^;Bk@aHAiDkR>iz+u<<)BW4+8YTu`bB1gx+|pXmS*H#4MG-$Z{<@ z$V9l$zAvKu3XoUr%6+m--)_`Vw;D+#Ftr{C7cV>MpD?s@EBtlyV~`DLREjw^#or1L z+7~LaX)&ggP$!wjl*S_-+l9SK6wxiH+dp!ff1~kN%i7kFJu9}fr>E5iNm>27R5$eqVGIic+XzZO&f?y_vqjCV%M%T~bZWY?3DB z*gx3cpUGR7plb8lm6pj8V)k{bbN}#vwmOtz{`*q>YjHk`ltUfpBJr;u?E7eqcNR9( zTDkW|@!;!}u_dkU%%_?q0}YaQw1Em_jR2dXGJG8N*z=mXNp|#1DAuIXeZzzozQ0Dp zl0QSbWfnqo@H}xq3|gj@&`IYk&xKM312i+RWw{7nsh8+wRKq_NAD;l7 zrOeIk0RAf_>=C_@IgP~&&KTdGC(g&AvY z7TO`S6wO1 zyQkSDk?+G)-nZo1EPsx{BE_ zGr9T;Tbpvz2j?@}47OWSC)C(?l}E26y{>S7Q){=C)N7j9Jnwpt(zV)!u=;E@PF4m- zC0m7*y*QaJsRl};l>xlrOpC6YOdQt!3(wi{_2JXVi*xE@03?qWZ9X5&GL-Rl)C4K%qiKJ>O#e6ZoM_#-m(EixZKk zsoJx?V|!=bcj3HI^(fB~h8h+(u_ZpzxSA?%XE>TEL{vm?ach8sO)EjGa=X7u(=gh5 za8;i#&iMW1H?pg?&9W9rTMkD~9MHig>?g&dgzO^6Xvyt3m zN^6R6qB9a#=Htq_7d!&Qiq5X@5OMQ_M-2-!4ZC~eZc9XXG%heg|K^tdJLeKjUb-CTk`<20)FJ8muF*dAB)=^aYy@RBkSfLmq(7$ae(;%|Bv~Q z@O3`ai4hzW&&7Uqm<}58-C$jox3!}PPJ!1}4g%4w7BC)2Pu}QNQBne;g)jTo7BrlQ zQzk)IH2VIWYs-QEXRc)m6@4CXGp=KK@i_f#-hAKhl(XApz!%9!8RRt{nalJ+Uz@?; zo6nBr1C#_D4lgQN?Mjh!ay8t7sj{bO@k{I}ncTH20f6!SVlJv{_ANxCzp!oJt0xG> z#iusN73_kF8YQuGdWSFUpj6t$asd$jR)K;LAYq~r9RKihWW<@%LQ znINfU3aZbkv}V@!^2jMrXZfQ{k8pshiQbd9<1Y-}H{Q1;4Mk2Kyy~+H7Bcm0w5A_i zp+yN0?tuOaSz05q2Mqlp)UsGQqFQEeJ!@}kTkVVu)5B~5BuZKz-)8OFa>O5^A6`Ake`gn4aO|1my$SlC z)Ac`bi}!~!`Ab}^#QDIUzGNRY7sT)t&ejb`X0f1Idp(7OVNNp1~c(RKekAj*1h!|8oD7Ck|dcls?}#s2c14FR0p&+?>}% zU>*+)3`B9Mh+e;bLB>a`3PqRtH;?Oe0TA`0U_0ReuhN_+sO6rf8T?UjGI)WGzg_W}N{2qAcZo`OF+e(5sL z_c8zTmVSh-z7_$xyaWqR9 zQYQ7#)y}V?tuJKQZRt84jvXvJf;n>=FZ|yRq2Md$Cxs#G?RPvn*V=HIYi0;$n8k2q zD(3@j^KHNC9;b@j>4F}Vu_>J}1t2T*-*0-veA@OU02omSn$0ZPvf5XWWose4q)O9^ zTr!`$%YDRL0RdC;Ki}k9ZaalPy*lppo(ry+?*!2_9RzUNhXl zX*ozJy+F~nEckyrdEK}80Spb`%g1nGZZ2+dwWtv>>2qjn`MZ%ZFcw*!Pb`L{9T75L zOsWExTY32!^w8z4E+Or|xIa2lOhBx7+4Nwqn1qV7iHg^K0-qFIr}=^wBplUp2&1G+uZHd6M_jP(Nayw>dU` zEL09u!;8$_zl5Fj`Q%aWOdl11hww5TVJs`2Tne%(}-hCOyVoB zUZr3;mPe3nRsG}~(qbQaPGeJYB35?}qUAlEh||y*vC)io^ath=HDv=eh}2kBL!UkW zMSJ_Ys$I6_f@Gc*dEJNW>mj0|?>BQ`vIY{Rrh{VcUNz+d4s#<@TN^@m(~<>oYLyoJ z7=5`r3EML&GLOg+L;KX0GNTo0-EEq|B?3ikQ7oG_o#(oD5d4Pac{Qc=6V$y?Kr^5` zQ&F)A_+?X2c7MNU{vw%x{++r{$#0Gb=l2Z)^l_xhH}HwpDSei9YNZ!q{-2KpSNWDN z>|pAT3>2II(lAw@(Yvc>eC3vnn%ok!3aR)l~4$V3|gj>(~wzpNadV^c}QyRs|vp^e2m-{DvDtUU@7Zwv4;;WGbdGI3;U%svVt^Bjm-zQo?E6Lk%?$di&Ix2@`}j(n2ieg1M#Q7@lK*7iZp=Zq{ zM8{$=2F6sa?_I@JSp9O$3~=p?Vqqv{cgTPMJs>Sc$A9Uhu%wU%?`Pgi7x@*W7CR`I zdK}ZtHkW@>BMF@XAjvpZnw-6d_&f>~&!|(U5q<=Muyf`#$OYorXop6;p2Q=24F$kd zj{2VFeSc1WQ_ft?O-dByEz6-^*Sb!~KmM%|U4zdWU*^9ys#ge?8RCMM2V<0C8N87x zy2IwvbTy041#L-XiJ4vruA4%0YlKWM^%z=w`%TdJG_xiId-d1eX;;`V4jBVGkgO5Y#!xBveh z{dbDCCmQZ5#O9JU$fKW!muh0#K$yeN`8vzreG6LqyUIR=kD#7)u~`8P8@$KbHt~Gp z6RGj>*K^KVX9gi16rvO**53?2YdgAS5^x_kDEVylDj&W4L<4ZT7wYt z`*o;AQ{*;8P{uJ~UHB9vA$}Fs$+xK@qN#-5p0dDl@=zwB33w2G)zvnY6We?0F#O_& zav`IYNY-rA8#NO{<|a_caE#3+?l)HR>`pNAS-S2({qhZUjrgO;xAfDzcc1dmZ?XER zAgu9i5V$z~_`KEYTYrFY`Hxk}VaVwg^s5FS9F;=t6_a&C--2D9tLajzuH$y1^y&sz zPqG1sJ`eAw0cVYRc6)M@@MmuN?oPv9W7R*H$2_-D2c^r66r#Le9I}+T-n*`;o&xxO z?iY4H*iNjSH@qYcDi}6=X6`|7#l`EXSPbIb4w77RRKTB9)}c2ClWB*t5?lm43mDNJMSM21D`1no#JKp`I!1<0qdX_{GFb4!RWs6{9DgD zh7t4Wa*g~)WJ&0byy12ILTK?4>Z4DIs4G)IlY{rti3IS2k&&ucdz{9gmyWXU>MB_~ zBOBYT|9BL$d>!~w;CHG!@+&8o#x3*pD?SzG)r_V}J~yA16!TK{G1B?$yiQG4*^Db@ z`nuWa$QMu6cYdY#dHj2DJ}p4+?&6jvHU5?}m+Y#d0+gV`VnM^3D|VHJWo&(^xxJvr z!NWjzGojqZCJr{(zm=?I$rK^oYM6nkgigu`m=*4 z&^+T#6?2JX&QzL>_ZP-iQ;9Ww1)>83<)eXDh*3`xwC398Au?LpD~Yz`T)JAv6PY7_Qd0tl9e| zzc42OXNc*SA~E!AUgGf|?<&CETw8B{4<_LM$r{>|Ck>EpOM5%(pr*13dgk>C>&7y`}k8`sU32-nm`oVxx6tGT-f{r%hT39vEu!6z&vKc&Es) z)#;yaFS9qpP8Rnj0FH2Azu47~gbPiy zH=q|iytfi~4+YHgqy(dRKXpg#t#u<0Iv;0FXI3zuPC?3SmIeoM>%G4N=wX+gb2~N} zZy>YeIm6$NV#T@=lGi`gOGII9rP{aJ4^VkHc+u@qbPs2DN>M@w=A-Cyi!FAI3eSPG1TxAU70PIl&?XGri522HCOv4XG~h8KOO(X&3olI5r}R$DS3&5 zbdXYbd0lEhUNr|lE%uG~Ra;926{F&Y!bk4e?}#YBeJ_B!}wk{}+DjMlg?^KsMnT#WfN<{{EP zv%V2ZbD`4U&t#iPrQg?*4mH(Yz)D{tnZ_k zDCe?N)<4-$@nWwZhYC^5WuFlpR;TZ(_S@OBWs<{#k$}jhk#&%&=X;0%t$po;RRbW= zpxm7)oMuNfYJ7XQ>rsO<7Q&;qbE}^u%(@R)oXqRY!QbS-#*W?;1s-X(bFekl@;T1? znnC8%brXarVp%MsjBw@jfsHdq!wZZ6&FN+=(tGp6G}l}SA9Nr$k%K=DdUC9=r`OTP z`|cZkp{^t(Hh1i>c8HLpP+&@^$nx2)@7_h!@PSav{ zvLG3?H=G;)mdLk6_g)S=|9YFSG%EXaLDsD2mp3XjR9k=LB7bu2EZQ2tgWeP=oTaP} zdsE~{f2KV=D{paZGe_~rwW>@VPQNcxmbq3_W>*7+9J|?eB&<@7^(s{O`pqP_N(|7| zbq{;Q@_?Cyqe0X1r=8~kN1Q4ny% ztM>2OEMxp-oa)asUk~D@54ZewdN-Q|(o;x-8*xfFOm#o>?`T7R`~HAsM>LEj+&>)=a3vg}c%ga)b-$t7$b_~-R34wnE# zUuS13IW9dfuU*Ym^$lZe5-kD{OhK3?&Y}P3^=KV0I6@SnMC6_kux}*JFO&gAJGH)p z77r=n?3bw0pZIk53lF;bx)kE}CKlFqN-Pvxg-a;m#m29(CYA-z+P>;K!e6j=`IF8kr(&qw~g_2AJFLJhr@BdkX(wd3tz7K*wb6#ho>KC>6BndB_k{+7i-ja2shSK zeQF%mi*QykuuQJgr#DZHQOrLYk*bH%m^dw@)t+Dz2P=JJg>4dL?zNUL0A<=*4M=yI zpj|QBr^i>^*WPQtSiZ0-rgrp3m@QwjIV6j%!m~XuJeWKNHcz>?>0XJXPue6`o^)Ee z0R|jhv1Oj5`O8{T|N16or#2D#VWGB6ED1|)6~;no{I;725IJgxntG>V3m~Og>2+m5 zA2_mHuhq#?K2yes4DZMBwpP*-3=K@sEru{B*E+RZa=9ex{+llCG zY(cIByVJS8oJF9WX-+KYeWPBAJ$BH0VInBCsdGK8zrA}nPMlsC=h-I3(r>Jp-I;`| zGD*Ysn9(+QT~LXc7k>Z3@MyWVa-p0>0^+Q4w576-rqjxTAnt-eD%ZfgiC^mghvvR+ z^2qA(HNVC#2J+y=Imk)km;oyK1p0U_^_Hphkby3#SO&J4(vS2YGdeVT3RD6W187-a zY*Ovn4vPj!4;q1eYD5z z3^JkO8*^EIWx*V>rny0JCY8oBHVb-knl@{PP9Z_x^iWsV_JROv#!kR@UZnvseq zkPTaO*C$?VsJ%(aEG|y6ledGp52Gucw{#=M-oVZdFZCp?HhMVzsA zqPec27)4DcwWzO0%{kEyy|jEa3oN9PU#O31#*LSZ^?HXz%a5l#1QNG|(c%mY|EXvZ zIv<1hp>viHJYgWF%fT)q3g`q+?PB*q4IuPo^FVnEEd!GKO2QLQ0}Bt!){X68zm?mr zJal6yq$b_oB^LyH>T5A5?uFV31F)rbk|JMWlY|8qmq#m5QYY(CS=bUi0llM3)yl2t7|fmo0_81`e`pQtGD(r_;os z&|IcmxP2OfUr+pc->&LJVA4myjXnp~6cOi*dph!poOh}91Nj#PpI{}7yF(|b-UnI& z|7th;g!R!){#5zPMYMrj?es|7G}zq&uI-N1-}&iBEkD;WDKrmccbWufXXP)e38y0? zBe(#7qP;I%cBisNGX(7uL;)n_FyUn=Qf_mxQXWw%A7avj;anZ-vc z?$wl3minzT?~FgPGIiY@VV}lC2+B$|;^Hv8NSQCE+GrFgtYC7D`!a~<*J#IGa#-4U zf=&n0AG%rfGX$Dqz^Oj@>0M=Uawj*vVQKAwVUN9}cP|dS;&BY^K?-e0rL36_hzx$o zo9C=_KEo7qEJ@RIU^3LXQWI_+EDuklW7AHJ7hg?jh%s5dk4nvJ!5_7oo`z$cyze;q z;Ygh>%K~xmtqY8m$U0SqH%yI(R$0wzXU(S@TwSCaMf75qSDlznCKum-%XDV_llKUJ zow)oqzJJO2t@W;*< zpsSsCy(!hjm!E574s0!nh7*bBR9p(1&)d0}PP<%rPyIAB%Sy(Xn?2-IYy|rJa}pQ@F$w z4A)^N3>n0Kb6u8D;UD)}TXLurS#ZqG3pDgEF2s^w}|ZoAPd-qg?}hJ>Th6(`)MCo`gXm51&eS ztg^P_9X9Pbpe8OdmuHRYPIfr0A}kS77R>B+S($skB%>CmCJHz(uoaOJ6~C*8&3rvyLsY#cq#6 zYendLGwrYDox9fssDFlLXMjZLPwCUE7+6f6zCI-(?2o>~DND%v6ajLxL&Ln)kGA}YGk8H_`#=Zv$+WG&b#=!00Z10 zRO~^NoS*UVW%n*OZ}HJO7W~@t?CX2gs?4j=uUu2%_HmwYrvl-}@IMrs{B#{V^cHGB zQr{$eIW;eYV=%kkboVN2)?tnZdI2?Hnj-9zG8Fl$O$&E;s8f3=Qo0NL%s6p|*8vdh zG0uCjFetm=T}D`q8GeCT4N}Z5-hD5(u>&GbXHcLU@kQO61w0j+4bN7s?pj^JqDs$P?p^axP5vQJ#d@x<*~sAvzEKrN@A^EaA)K^&A!uga1M za!E9w&Kos+pVd*Iv{!ZaoaY5OQ8`ut-2JXGFKy1NUB|Ur) zDEVTgD@~>=m5E3a_n(pyX_xRGoF#g|(l&qb%^llz@_X1UivmQSh1Lt}H=bmdHh0<# z>lTN5vNk?6;5^9~M~}$)6z6aKC$A68#Vxj>3W$g8lI&rptcAF|qcT{-JJ3w8}56r>ctd-2G98Ofb*G{Yo_gpZjOIx41P+sjK)Obl3n6u&j@8ym~V>nw%ru~40A|7n{gv^6yK!{JRcXmHA~ z^5KdX5`2x43hk-rc#psk@CEty$K9kAiFLD$iOSNQgTMD5VhLWc4fGwo*gcY*n7`++ zUf*5&)DN%MSo3IP8rF>%d{O4CMW-s{?m3~NV)0yM{Ju~xZ-6AD*$`TaHCmLWpci`c+jwzGcVYZ)~~MlewSq= zc#nm8l9uPt)6SkYSHSk7F9d9_njoZ7>&bP;xp0A(S7vY7-^t^56B6JA((^Zv83>&oU>dQWjnmv8JJ=jm{ zD#1`CLgi~U$U)Md+D1?^Z<$!UX)&k+ueU^l{zbecTD-f?E*FhPJzi0F&CDH7aACYq}0uPhF=rc9&Q0%ioa01Rar7!a0G&>s{8(u*z0Kg z;1$mVKoKq+EV0c%E+qosrLP$vJY4b#7_Ft7@w&74_^m&Zq&7Pf(bN8rlbR3lDQXTfqJ)za`(9p?;@)elg09iKaZZN0Q*Ck4_-AYrOy6P z5u|8T)_?HA zc)Pg=uUmh=h(^)Fp}Q_Q-0?$9iz(ip9rt<43z3qX?Mt_!SW_)lz!5)%?HR+m4W_HE zm0#BN(&s8s7U%pvgQ3z@u*}Vf(}lVkt@H*)2dOSP6EvS<78T}H`+q&6F}REg-r&$T z(Fv4sN8nT9EM?Z5IJ>pgd&ij9rkHzp_#68-Iyw2%{+O(zkG5P=#)%EZ*7LvL?aesIiEw z=TwJK_NP?H_!0IEWb>vfZ*|CWBmsnxU9;HDW3}zrGu3Y{yz9Gn$L#^wO8lE&(-Rx) zvjEeHefSk&TE<{9a8Od&*Vl~L^wRw$R>|AzUh2Mk0`W96#R@YEE3H~l3FpY~O4>7@ zt2UKHYhIUE49D{OZ;F>FBE~l-Qr{Ev4zoiN&JdD#2;7#SbySsor z4z!5k{U>UCbv1um4$*;Wj}|^2Mc_66_l5$nzFk@$YrYyq;$d0Li%I9wD8l@e98~Eq zvmY-g1O4$e1&Z|gs{R;ie6LG2HQ;%DWQ72(>g{5CREUfUjm%)BW$HNJDyO@}oHq6) zoLGg#3y61W=5dT7-NU2@a~Ufc-R{97sZo)ICQ2vFrzgJ{wrWUj0OIL(-R{RSVdcVp zB`d#X8BEpNXsw~~_bXBxT^d(p?|ekQaD-_e2Zihiz#~HWXB7me5A*_`vcDdK z?P8*^co<8QxZ2Pq*E<(RDb^I0oXV=}76rLW4yCjxOW0$_6jGyoU?vu~2~lxVF5^2mcz%hJATb!r!yE`qu#AKDt7oDIH&%RB{O0Xof)GDwBQH!dS1HoXBS$+MUnO41!dv(KEX~t=Lv8)J;p91k>f^tj74AxWRn}Me7J5~ zv+3UlAHP>5W&t18?>xB;!^wqZ$ht+6ShktX(rRqG*fINf&mt&9Y|NiZ*{70oF;rm9 z+}tYXJ!vRHE(5)imJ=HjFMGU`56WN=g-EghmX$*s@f%9rY*pfG?*KZU>RAXPFe%gA zq;aft4={Uw$`qsezjkl>HI;gPuL77(Bis83#pHLHxfRVcZtypW&kg0-tH-K0=?G9U z+;hFX8p)wv#|)>~y}r^1(`QQc$OGImPHh5x53&7tMqQ@x@S#9PZ=I8{OWx|Y;pleA zLZZ0lA9GJom$gVM8m|u(T-cgWdo2G*IG9Pb5om3usy#H#`O2qMV92`9s4(V^yI5b0>jPTR; zkH_ST+xtre^^s-+hjt$XJi?R{mrE4+v<>bCSPyT#*%VN$lb1USbw~i(u)U_ zya54k+Z{*KuS8_OB|?7N2E!g-{$j}e)y)L)@%l4Wb<9h5M<5PF*VB6=f&0P69tlGg zqq^lE)yS6iD8Amkj|Liy>&;;@Pj_Q*UWYpkzG!3ad(~1U?6q>EAGy|sH%k5H^yzKh zdMKvMaoLKp@+aRR5C|YA0FbUb*rm~OC1AGwE+)Q|mPJ^oXoP7;?EjohDaKWx9=%~6 zzVX)noH}PJFm3ZuO^)|Id@VOalQWh#hci{7ptT+G(Z1=+9fLi>fU|zwJNg+~6^|;j zoeS$|XF}qVn`;V|DeivYz-%n4( zTN0N&*r*3G#v1X{k#oC|JI}{XNUXs$HlpVm2@YKoiFX_1mZk3qa!frCt~WF3;Q;|& zuALbo?9-vp3@rYzU&70{s?&&<_V33LuhR3br5}cc5568T>}K27PSbVbd#~&?$xPX{$+^EyX)c~2Eenvm-iLRx@w5bvqPopxA9^Z9cWM@dRSv6*FJ-g zWJ6EolXipyDjJ>9s@j%4XU@Gg0KqfWgh!=uJ3H71rIb=KZ@9kF_n>pxd#L0f ze+OVx`ZkF}4b4I{6)3|Fp{MiHe~UhbSwdY>^_ktlcz&9pQ+xjgFq%ET(KzmJ9bsFS zv1+Oc1N#&q&9x|G$54ZD$25E8!!y#MPwT%V${t_R9`J9W;h&G{olx3hF&*Q$8oKa% zAZBkfdRCg2GT5)Ova-N_P9pj3Y@xj6!`b>{CTVh#+Fu4mjQF_@S{u%Sj)c}v3WLCf z1(aalLcBAWT7arf?U1>DlKiD50Xgw?(Z{?PM?46}&X=SPof7 zrZZamiW5Uwc9|Ke$rp6fbV9hn(XXpb+?mtjRE{bRoB!3pu1E`OsE~De0KWM+{f`atPn?wW=a|ASngLAApK&ESoPa8Q&S3mQxBiH zpT##Z2(LXRGh`mlg}pp~Yrw36ueBkr+`Xml!E3a9+1k)qD`m<0q}EAijbyp0yz_Tt zHn4-p@cQS~+A)T>V>-;hL#E2>GpF<6>e89uR6Vuvv3VcjKB2R#geb}wyEvD4gKF~D z{J70R#zLSIZs!2`Sf;3hUmo9jMlI<^4>%f%5jsopAIUQ$#%%69Cqr`+V#9pVnrY2x zYkT$x=&w6r&&EZ-(45@sKP#4gjM=s2fSwMv7L8GNvX0L1hyybD;&~5IDtv*0$C?$` z@_A#way|nFW+ok-FUzsX&*A$~EVV9aL|VB7@!4jv>k=rwf+EIsk=)LR$0hlQg`M1l z(-1}pQ^f&{%KFzSr5hNH%f8i>TzIPu%5KOYH0iR3yP7DKSML|W(JADZ_$TAq#c;BC z?^P(1*>4UgdFgjTMf=TNxl040+cl?+Cx$ipzjRWEDXa`=SK4Vwz_qlnR_gClO8+=t=6s5(V5(n1~LW`ywH#Ib9s!q zVwK%OMZ%NzT~OXI*VcQ9{Ckay61(m+6cTrPG`EUk@=62nF{C%V>Qv(s>5D1( zx4P&?5q<)k)@4z5v#){Md2cIeM35$L%FWk`Q8gH+wMSL?Q6{D{WhZQ1KZgZd4)JsP zXzFY*AnQMMqpTB@WhcA|)+Wd^XzBI79B)EAeKx45J@RdnX&KNgBvpBmROx*!wFS+m zQ%9Wk_p2Hl&n?~{bwLX(J-S}bw1!ufI_*1oyxQZgcSRi*n;Gn(uwxh{QOns?Sr zWUo=kBUdr?L$}%mD>1|F5>E7@ls2kb-0@)A064Nd=G3q$9!;(+85nfk;H*jUC?1iL zJ}5o&%DUp^c!RH}>f|W(d@QUN)IeC0KO1E1AB?-@IS#!TsNczgotx`OFb%smeY&y+ zs;=EBh`sdaD1t37-fGFhga)H#sPQtVR>j*Z=*B}*vp)I3JIfbr2Y|xJmQNg3_@o;OJ%B6(z4?mFu_%4RYA#F-j>8rS+Y?6XUdtC7 zZUD$$;kcf^2so*A0gtBx-bUE~(}&ORm{!t8!L)jFxTZFb7 zFZ<6g;VIpynNDB~=Z#zx@&20YPT92+to1SL_fpc{>-{2mu*}9J%sZy`@rkM)<|#?M zM7iP&5KiNx=RFk4@EA*|T+i*K3#u?vt1rELuP|0T+;rD`+U2Cem!p>NndWOh=yNPr znV`lFhX0-~bqcpRx2UuL;T=3duWzP1t#X^p#MwBW)Xej1YBJqiX90di78i-a(xvLN zuMNBj)6!ly>Z3kPnGqjpPM#b9MF>&R2}*Nv9J#erj$SZv80n)mXQ*!nEy{mOglecS zao-!i2COeYzn(!r=ZyLz(XC&M)K=e%Jz1T)>DH+mNue{-ARN#GprL7PcMvNgiiPgZS+(?JM^LY zLu^M?&XmX>Vs!-=6Z%n6!Q~w7bzbW;hXSvNH&Uk*t_4?&dfS>#t*guq^Cp+)4xBIN ziwex&^g(%&@*6%=>%EPA^AXT3HSL;ZNqRhV`?S8lp9v2c;n=KD8`LMTy+w+Rl66p0 z{!P(R-gcEy+0xR`ohIN`8(@49V6jehSPt|GFTVM`v+~a7M9F6naf5s8#t@=j( zgY@IHAt_<)a<2YhZ$Hn5O6`nP%)%Uu7_ZXe}Tc>-%6ohO>C;wyabv1$o5g7X(# z(N+*k==vN2*ph&{#UD=%YPj+QGQ-#+H4NN;S&o8_Oda+J^)_yrB@#RiQ z@|H0U@n)_cL)#fK(4K3W#|H7a?KoL(kt}=skYT)wYVe>Jbd`1D6Y=4kwEyJZgpj43 zr)ppOx{Ysx$)8%byknWB3S4k&db&iO8RH^ zQ)e|ArV6Y4sw8;x0#SZXQ>5*=@$JD==juHIC>(_kUrt>})_RbqBK1UR8iTQLU8Yf> zp|bienE!vo1Yd;2RuF5rF#vP(5^B=ZqW|?G-_n8}yy-rzx`)xtEE@W%pbzJos3{(Z zRQG~`;Yxz?N~S`bStJ3}Cwz!YnSm~E4=W{)v)4| z$l<@9m9-wyt@Et2udhjFb~YB^c|g)ELVa!_&H8QP6>3@}NTo}zSht&l2A;_Gym^~F zki1WS>G|vYuEs7K?HgZ_ZB#}>n|OV3OV7<3%2|E6EyKGUk($fxe-E%Qr5^h&lqs^w zxX=a&zG4!m-1jR^CWyiH%`v02p$cCjfi7{EF5&v^WId~5T|E92@9lph*JJMK0BY9mEpEC+BebHQkpL|g|hYr@~J{F|ou zciQN6y?=E9bfB;<|9Q1CgK&Le_3@^rCeU{XO?_B2a>nu|VBY==Go(N}D6WKmzcTOu zwFQu6A}QndmO$>fzrSCv$EQI7W2$fAU)=+YQ&ruo)CZ_~z8lQ_HOFcGeiy2q&2ay{ z`kb@jXRN*ZG+F`qR>=J4HSy2i7ZMg1_W*goI<{L(Lzb< zoS<9(eHQ<3+lRm1f_`{ze_zy3_`V&w(|L-aC z*X8|%X8y)Y{*es}7WNP8sde{Xc`N_lzWLX_=F{o&wFbpz^QqElm4NUysQnBWOz8gW z(>Bvi@aRtM#&mUxd0K8FdAelh0Z*{W?qC1l6=+0*KZxbiUI-H&a!?#IH!*xtDRJrf ztJYU#LPf)D|3bG*xcd)h5sIrPLZ3XLc|`Paudl+c)5e#!Gn3mb6`kL?aPs&5 z|77po7L9@FcBQyOsx7-MlSKWi&03$Vt8B7c2V}U;K2GILL(MJz@o?2r)0f&TmL5ls zQ_~)uH8i^K>{NiO!F1{Sf2{p5^uQlS5(&ZTA|=QL;o#@6QZyD|Kp{-m1x5~nePQrxRYTcdRstL(I@Qe z8F2c6S(9a%Lz?;W88P07e)rCtu(;Eq{bavfCww_bc}iv*^gaf(&cUbC=Z+Z#sFRSjWJ2`Vyy>0BzH}0Js9B7dmQa`mJK-H1Ag$; zpZP536#i)dBlSUO^%1Rttx45Kery*pOH#sX!)6N=e&0T2_vssG{fUV@yZLo~Oh)$p zmu4LKHsF+b8|L6Rcbu90dn~LQYR0Oz@Ad-zw8VZeaiS|!q%15ICgD@1 zAF?{x!A#o(Q6{svP$yewLb}m6@9{OE)y5?SGtq-JD_^H&>n+0+<%Rs+tgy5ph!b5MRCeU*+hvW3+g0f9iD7}J;= z@ZVn=tzFd9B@HA&yUI0%{HLaSL?pvW(i!~HXU$DqHxhd!y`-1q%MskZ&NZl@9n7XR#l2Q@zwGBt=SQA5n-Lh9xv?EEfpOQ*r--W?8QyN@(xA@UtYAXA z?Gxku!_-E~_zAW8cGvoAES!xP*RI(8 z!~kX887+V*Ti;(}f=XfX-dQ~1JgHWsj$wk@S33z8nq6Cn&lgyk5RDjAa4*}R@!eGuhq)q_pO}U}Er~*4S7$R= zyCrrWiy^kvDfhXcBYDy@c$4`CZ4{)E_AzC(M`9nO0<~dEB)H!Zsz{m+oiO(GZ5-&g z;Tb1ym`}-PkEieK+Ox!(k3ufTb{B$`$y5$;M7JrE_NF(9DlTNsmV%nsSGC5)J+9+~E;Y$PIvLKb4GhH38ANO}4b8nILr-zR3(y7> zw!7S3_tb?Jw_!p^z-X5tA-goKkImjzJZmj(LDo}V9&YQh87|CAPrmNqNqz`b8b}c% zZ#tG+xVP#ru%*qwE|E7os@Ajf#8c& zAiGyu(mKaQkGA``6poL1pEoyw`BfXxEoNZ@Y6{osCMtOlwK?`$r*3EzsdCo1_Klu~ zTpiyYe!TA?BD!aeZ4$|(76XvmlK&3vz~NASGq6|3Bf3#`*3P6_D}@N5NAHg4GISae z997d)r%;=QT(Sn3L`gA!V|A0Kvy&*qm>XRFC~kj#pmDs05#g;h2Q5cwdUHC;!{(F5 zeaG7B#Zt5rVqpdRJM9Z%%~Mw^BLUS+cz8e0yvyr@GG-enG}U7~~empN`GT`zEl z(2M3nbAHcK$5+cIjh*<&rkZ+tB$v zx-v$&7W!y3a({f{h*YJ-r(W;X(cCA4N)x$DE{rYJfNrCV9`5Er`;4QGs*Hsicl*sD zWQ_;YucV4PSlPLo3;-^bbf6f~=F|Vf-gkyIxozuW#X?aL5fHEeDj)(<14KbZnn>?N zsUjuPO9-)oNbiJdrFWzT5}Nd)lprO5bOR;W1z4 zH^-Qx%`x6LWWGM_9#H|uY&1XDUXGS1UU4uRl_5U+(W!ilw-XuG{g1Ho?{sX9uf+De zJ1Is`Q|XWzpR~l+i|5LV%_3obqzM9|A{9iWlG|pNt`qC)(Sb|w#E@S2a!yo@+J5h; z(V#nUtPk;m4R&0yrltHj>TUkKmC|lvnp5Y5zlU1`p771WEk27_q~+{BpJ9xq&*+5G zKCLdv(MB*XkmVH4*q4#Lm$6`~oi#&(sI)0OG}i1f3HUHvKgXpr!hOZq^5?s4yD}#8 zq?di=8ELhr)}1fd{AbjXRi@6pplKN|U9$niOmNyGX`p`w1ltOjv(lm!Re#vYsu3rT z+`9;8?yMWFoy&H(Z04gt=0YWE0R;3b1=q)i?I)V~pxrkmvI{Ujm-wVjg>$(;-?xTg z&^eUD8;7@@%`u3r)L~3beVvR5)O9x{9gq5S*^Nj71VU>agPG6EPuBInG4J(*+6nr1 z8)L4p7C`d4#K*^e!aGf4!pg&9e`CJ`glB=SbH{<<#BBieQIFONumbGis&?&ly8ip~ zyhP=%5$*v|j$k&aiTNTW!t8Tk%3dW=IS$AvU#6;ssMadwW#Fu&=Ii;Hl5t3yO3^r%4pT z74^~*Eow0C0`Hm1IS|~zrei`7AVqf*(`tFx0&wyath`)25j?lIYO(X7zl#rltoQj% zxcAc5$Fx`a6O5}4J2=LCID&?mW7Qvk=lq!#I5k)>*C&8|eQ$ei@rnVyh$JZHZm44Au^l|w_Ho8WaC|2d~Hix?a zG4fS0UtD=odj@)GLtLxn&fZwm^2#83>)8!3Vl(lnMD<^T#QV2L2L-rR&ZQR56c$Z` z^mGAgb2XQEX91=#=wFE<_k6Bkd;?JQ;Z86S%zW=W(sGFh(W!6uYY9W8B|uBM0EeI( zyfJi+uh?O@deTJ-WrP>0xIPx3;3kq*;gViKXe^k|U*z&eFD5UD6jZpFFL$l?bOZY^ zyFn5_z-dO0YT7GPj$4RyWuWG=t=9crLY$_?z6}ln zWx3ZoY=JB$zYk3gcdV9=J>%?@c$8fOHmHdW>0cHjfR3ffy&hpVyzWbgw!ps@ndNoM1p= zVLt`LnIMkA{X>Na;%Lz0?pc}$PIV`_7QL+_umTQPg5v7nN_9h{5BLf!c@=sJC&oIezhTThyK@mz8L7|ntFtK-dhwLk{8toGAPAvM(L z;b?vOI236@+{TA?<}uuB3Sjj)E8{>C*OW4`9$t)JP9{F<7BiXnE+Xscj>q&2x`IYl z(iQ}msvgmfLL7|04ej)Z7t}4A&+P-Oi|WI9j8zTzhZ<3dwkFwY!RgRF;R-9-(#pWB zEjtMV?)MXSp4}9{#Yd?zwgrIL_9*O95p?Pg2!Ad}RQ7Pxn+LVKRU7ZH?GxCmWi3Gj z)meS7lx99lA!U8}Z_;ipnMNM3n018+dq~yBo2W&7;aLTz?cumZjA^lZQ$%Jct<*rJ zrjwV3%fjSdvs|4r$dXC>gF*|y-{d!syvoFskVzI^>_z49_OzY;e6J>nU5TnUD2UvA z&H_VLk+aFoIvK_CSA$TR~I0s3D?ydGs@VJlgeZ z`z3t<$$psbYT8_|+x3F=?oJ5UBY#GTj$gdH+n6A;49-bKwIOf9mxu{2KYcPmOT?>T zhkqw`H`s1|#U&eT0p|tx<4pORry#q~eUB_+{%U-HJn!0r1HS!pkwB)80CXe7%I401 zq*`R)il}4Ixh+=rW%O~fr~}J%v<9NzA1WdH=ChFyf9*!)isq@Z%NtynYTq>=;wS3> zROX{8Tdb-b%?fiB8wdK+Ru;#Jd>`=Qq2^;&TJc49%T)g!*}mwh7-V8|4;q3wkB3~0pGz2RX%HuOb+ ziOSMLWP>Y6xkI5Rd6s`3Q=a*h@yjNh^%`PlMhEJD#%hBE?ryXVv&&Bi!QFif84xvH znCk{0yweuc@{gCy*4Z?@EGm=b9rdQV9WCQrh4GtD&BR*&aN6`qaF@WGn z7k_nayYxUo;qA9D-tml{wq~2QCp<{GE zUx#gaSI`6s)SUhraY==yZdiV0`%T{+e!r5^$1JpNP|NQyrrxA-BW0A)%S)dlEQF0b zC@(L?G2Nj56|K#8637$w()I&~_sSMU+{<^gjgNyglS_iT5h&>TUMa;cpzK~P0IcBg z6ff{{nxpmdH-M`gFar=BAZvKUVu?V?*>5OT)|r`~GpX+pND%dAcvN)&d1A`pFfN0$5ZXxc`PV`};#ShZap$aQnvIzUG(SC2 zn>@J;9kqPKP$#v8elui#kQ$4s@@?^#9{x8M=2xXQm8Dh*wVi}Z7X4QyOw0BKT;X7SvSCjPyH zg{IURr>2kVKn(@+WYNPl3FsN=+si)#UYo@Zg;vT~kjF2ZI4cFXfAXm}YsY^XHCHmU z%tN2UD$<*<{VwC$b-e&7D;kK?FYaZ>g*LOFFSb^Rnz=oHtFb`QqmBhQ52yICRan1^%ZGeO391>rz=aW1wIql9sIar23KXWUMQM3|-Sfk&9;7nvPH*Asg6x*a z?J6qO-`PS9gqszElkC)YTSI2L3ZL37-($M96)S$H4qX}8?}23=D^;zNbhv->G`_d{ zv7)2jiF*xJEFQ@1sOxUZ6#CH}pL|hZbp4~QuUhyAIU)B(0p-FKxc`aXj}^HSCU}ct z5I(p+{zAeYQZ^nTWg9zW)LBVKn!>>X+oBGzv0%O6s1rO|n z`7}C|zy(ZlP*R?zf!HAns9DHQjr%1eEGZ~=eQLjH6CRpSNL#igi!oRWHq&>l;fpC7 zB$vUKM2+3y${ez(kWsZ44a%AUKjmFDPU#;>gQQmbi`X0B{uM@AijF$k(N*wr2))tM zeof{$VW%|9*xg*kF}!6ydFt`di@rR#6D$w8TMxX652c4b`w7g+bzcxppNhvb+_57S z=vT9ayZ~@iCB0MO`HNSN`0BES4|7X#$J$x@faT8qHWg**DLXF#CAmvs@^bVy`x^=a4+?QRWs7yERLVM3cmBwb<>!#ry`&Pd;^0 zx)O-r_n2H6lmr7toFP*ie;q_rvoN^-EBroEQgeXybdwEA^m*4}AQ- zxHPelwcQ~jr`FBu3Jl9gI)S6@mflgCb3inUt={0ot9GA$J9}U=o=;WITG(#tf(mjQ ztt-U#Q7iS^GMGgl1}SAIyVLHT>7-9TY02zYXT&I!Io6EFET*W?pQ}i+uXEn{T?Vxo zSjW9W2N8DNaLA6r<#btBJNJ!a#6Terzv;8AT zA&YTz0qLIL)41_$Q#63n0dpL!=-TKia<*-I{Bh5@^mYd{)DU8HZ8@1rgOqw=d-5{8 zClt#ZpHAJS?eX=dYFYq2qDz`H9T{10-nWcC8;CjFa3@dv0iu~-eCIc1=~qVvauapi zy;|vFpWmQyVNHNQtp4BNIlDPn2MgyELh6E*T7apdTi#xwyuzZc3pA=fpcd5fWSB?@t z?%*Ge>)i6$&xhU$60-|oFFhKmMeBaK?$X*M(}3H*jPWdXZ`f4F&b#+~2Bzc`Ps5k-p2v#jG=x zCDIuub%nt@cT?EPgPdKQG2Mv#i$2%XVdC_L@R8e2;#fcahostdrG=4ipA5fY%DBqX zx9~6Lq3JF_AXE`E3;^Tzo#y?(M)KFyx$75i%3R^ArtgEHv9K$VRxk#T@;-D3#cAqp zZ=P24r4wP~x42#@Dw@4Cl*s=2&WvN!)Cc|?a^88E?NkoFr!7uy3zCnqN~}GX-!@TJ zeHZd&UG{m{vkc16lUebItA5x5l?+QOT&qvQbziq!Wq@wObTH%rGUfa5SFzOv=cCFB zSHW)`;Y*I=AuGYxxD*}IzW@zn>T8^F$)ONaX!;ghJ5g9~GsUDY`208awQ-r=2CXq^ zz;UnEf3>9j80zM$&@x#slCsnjz8`I-{8cA^OJ$3hsfF3k{J$`T@8xTynvU7+8F?eO zdvf-+){;iF-YoYP_-FBp6>M}Xy0YV&Tl3nM?>bU{H$E~LyBfeH!mwjzj zR`~@*U1aUI>}<7?PCOHFIZISMzG?RfCHX|O-4u`_>9T($4);+OKfV>*up0Jk!DX-V zZD2FW0zR~U|05I>dxCbN(-Pg*U7eTd#!~yw*brh%o2mAK@rUKem=6GRcG`HH_}$T4 z0L8}W5DP=k4=;L-`R3!diyQzNJxv!^}#c7M58d%TP*TYl&{?>^JfoXB=sXCoaW z-wt;rxlL3LKN0(bZ?(8?HI1-UxpF;e3DVLrAgfHG|C)4GH3#Ce5a}#gjfLu5=8xV<8i&H^J*s8e`dU>(TfN` z*US%m6t~W3Hv`bsyZq?Woovkm-r-m=@g?cjfVFzn0t;~{{Y=DA#q8ay#grJS6&hs{ z2S?a95t|ap=wlxR_<9|T{Mo1AaUr7v8IB>Cic~G#US`vq@x~7|D5Djx`7e^5D)CT+ z68co58iRcSPT03#eu4Ih1nl*_s?(y$SC8f(!3S_HYgsRm34eosgQ17~8w_0~AwI;= ztS1dpYMZ0aXT*q}%5HgWt6qpbgD-qWr^<3A7Va#33KuBYyD}Zxz)4$+93RS9CQl@U z^@p`f?oou(7!LkVb!GP)$|=du86iqB6Cq>)9W55_kBhf~d*VEMwYb|H?S3+E1oFJ@ zSWOQ^J8kKH`IWs$w{}{7gXlK@CA|X_PIx0KNI?Wm|4vv-!UOlgTH-BT>-HJm40WVQ zF3T@Buz8HqST$B|ScWKpKmarmjIUc4DKASjk`uq~V>11fN_U}**)ekn1mH$DneQwV z4Q4^|^rkd2wwO)Fq2o%=My~e4CyX%a3MP?>m;LL`$crIqeamA&9ALZLL?>|Y&Kz)~ zpibxNW9LFr4r&5*36JFAS*kVflu&wg|47=YGI^)eu)?leT#Mk z$S~}=0=K4inR|y@ja_x4gEFovz&7@B`?O zib9Ww1}HBXO7-EK3eW||7l$Y}d~HLjMbc@LueIKu&p1ZS@K_G~OwGRxmIxcHNL^F8 zP3<39X%Lxbi(eRdk}%J%eJ9QMF|(lOr^eS~kw<>kH)N`mS4bV7Wx1KeT<5yev3*k(F@1Wmhwrh!;<tZl=*Ijc*zB>3mA%FFO4rLUu?C`oL@c$Bc$+evgja$gO7uxI98V01L}@>_+=S# z$Xa#h2OshBN->m|PJdEPZ}`BMJZ|WN-^L3bHMztsEMZ@eG2N31cY$xjy(R$s4&nqx=j?WEIvl zpJ%1oVY$HT^cB-;q4~P_DS~HB5w-oUYX~_e9YzR~|Dx?~SA(hRk-iZ_JY}zt`2uL-;)@6HRjJlS%+G z<_6Q_JAYOBqs*6##46R?JopItT*i4AO?=gt|P)k^(nD5m{@OCSs2H%buH;EGd)(r;|o&o=>e8T*@0zyXsS-*Wot@N`z6{ z8fcmZDINEXeg%>R9!CYbU~|vRYn#c!zc1nYSSzj@6NAcX1#pd(7mN2f4$9Wes$__u z@+x+iUsQ}wO<%glyI-IUtlN^n_Jn1E^6|U#55eu!OF|V|&O@qvHr^wyK6rhnmJ}2p zvnciL+5Ke0=6i3BRtx-^s2^1uFcZvn>U^<^{lxl8n@CBI!M30H8X&n0=lw1oi4f~9 z*O?Il2t5;_k=ep;=OcYzE0ML?{e!Ylv7cV2A%CF!-62I6tAaLr=%kJ`-T0|dV={(U zKx0d|s9@xb#np;H`D20Q?A9xFlUbiN@oISUSAjnIn0?iV%BPT`zz>?f>zxn_AcAnq z5orF}*?c?F+Qr5wXLl^r|FGcYBH@;&yBQ~OUf8Okbgq)qY`14ZR|YNPL3Kr^)+P|K zd{`bpx$d{8N5ImJ2+cDHT803Tdj9Uqn`bMf2@M_@EfsA>`|2;M0)jbt!L@znFxWyAH@{+lY)PJm5$Z4Up z@)@4xGY)ylW5$^vu%2qOw?(e_C!HfEe`LbSK4A$6<9m+LR zOl;IQ887z=!M4`vhFp_$j0>>@&Ce=K6k|Wa(`v@@Y*<4Inz=IAyw3p1e z=y9w1qz*~j%q(qAt(NIcSDOW+gEHs8u$?uS(0bsr(mB^u?QQ@4z#;88+E%|;Iy8cn z0I`0+e$HbAs?ynPw9kKMLPa^f1Csj8)qeY=#6d#d+wfx??%+nui(kEb%<{JyzTK8L z<`YyjWoGQte&Abeu}FVX;Wu9hzbJcje5ohW>SiLuz3oSg&ZlF@P44u$2N9>e?e7tm za(4U$2e{N6)LjO)qZs`YMwGmdZnUhW@d$EcS$gvPu5VTz`7Unl~Fo z7-|P!0W=}%q;~KlE1xhL0P^XmoR_noofn%-W$xF>e6+zlQT;{Pwo@cKM>^vIR zSy}sPar9jG^_*FK9_Q^bHOw>7b5>h}eOEb(yi?^P!E4JH;}x)vA^o6tDo`7kuBjH- z%)(w7AV`)las!+~EN|bC!u!MrE39BnvH*sKUeOVNVA&4TWfaPGllL2oJm4MzG$Z=% z*XBZJL#RVfwC9&pS!fEzLog#c-7B0WmzCe_R4v=S&mxPoXQ#$9k3G3{m{U;y(l^LZ zA)D{}$&j^^Z_@<$Kfgqxy6K(tXrWTAF~*LyM|<{#*jfE|)6Pf17lZ2IoF%%CRS0Sa zo!@(UICPm3ogB<&ZoMAMVnOYiQOzw&*>VCsxhmPtB#UsPp|kAPa$6ziB8uxi z>m3a)#40!SkGB74?CHw3RJsc(vT%jCxqw&eGEQ7=EnQgn3$eXRRD*KT(<{|9Y2p(3f=pQA-RuRW!M2gkzpMM>oUs5MZe zS>kmfmV66WtIa;A9}ji}x-kfz-N&kq@l)RufWE zcB?-0MziNZ^+F$ym@+p#VtnIJOZIlYW?HutK4g_DEoF|wFq+i2m9_s&kBxK#1 zuv(#xM$^0u1@n$0$e~;gw1KDF@;+XZhYvr9`=w~9TG=6?ebYV5E-eiQCEMu56 z@D9rb;ie{_6{DI|sh8J{q)kob(&ht3FMHJ;41p%*H-*xPM|n;KhG9&0ljQ}e8@Y&# zwqN&8%o_zOk@@=mE%Ud4%&m%Iejr>&QQ{rqA6`s+^{l~7R0A}9QV#M#hbu?MLjwCl zVmUzDcUYgniWzu)ZOAh9iPz%#x1w&!H&HyXy_u}uSY~W8J$X2;BCSv1tz%+{YC78s zW?8C`d-}F@kxrvaq+EZD+(C^gj&reg2 zkLshR&DsS<5~|ppn8*ZD+))eIU^U{pYj=6!Tum$~kNrV*C-re+0NH$fG9IlvI*Jnq5gu=vR2Cy0#2^MuW}(;4G!|ZoDn`8qF8kE zU*bpY#lCk0I*M668Kz;};-ZC$Q@(m_1*a~fEu-cSYo@>yE0=TZ<38kK1U?2ZMb{}GtLpO#1^ug)!r$|D0s@fnSNBa zgdo!n51fU1bskU<(4l(T=Pi1Pv$xvsC|PQ(Lv7aS~y%b3dW^NLn3g;vsZXDo_F1o|&dCT(b+? zh2}(t?n5a&JJ3{N#&Cq8j{HPz__Rb8_I^D2dO0{sHHzANUe7%B%q5OiQu-*Q`e!cQ zj#g1Z z{oFW;c62PEe~hp>z^KsBR$u2mg1z6O9tL-%iN!5*aV262PAj!z;^JsDJZ5#7v*629 zLk^`Z;OOUI@Nd9;TEN+-2t}WAMM-;>Y-nlHPh9yRY|EGrC8@6u)HX(XpL1l?U@*o- ztyO=>|Aqs%Pvbgff-gg|#0{JdODNd?TCC%6^`F)9+rm!#Mhl*nV(n;dmkkLQ zWMpK}F!#=2(lGwr%xcMz9hOXOis@!g8|6Z?++S$V50w{+Ob{qJyVmIzzhbM3ddm~! z-er|h51kp3>xfR&Jy2!z)8~tR;d71OPD0q+x!eL*;i?Z?{o;u4E58GwXnXkqX_@=b z50=797WpYzg-K?}x~q=@AhJ5hs&>OEx0S)kyn#yQqEygkgHz$YSA%XoIPdm`h0yuT zfvug%!5%msvBFb)E&J#`rndY3sUyOHHI(}ZDB@A!G8QMPb3nbE0l6W1(a4o!lgHxTLelegWCFOvh62Jl1m4JD?y^ zP2Xh?lhqFx$wd4@Zv037wn>7c3Zd_`pWMqKX?YZ8{%#RN!L-WmFd}B#;Rj<|( zU1`dXdEfg4`!GM6*LQb`u7Vrg9aMwlU2XU2F3;uwNetW0$F>zLT2A*^{!2?#@}j1n z1qpkc+3|7zTD%)JG8nt#AJ32XiE7rl6`LP9eR~D^=nS%TzK7b3>d`QkW2N&cgbN-Hv< zwzS1p%!U> z^8?ATC8F!F!Fxtf(VgouSv9qb9Y#L7+iUrzh-@c}s4UuxG)DI-s%D(^|1M|(u6`*Z z>lSXiEdOSIXLB;lz|qUH0x^`bcJ-I))z&Xny_`cG!b5kNn6%&!{FL#`HszICLiYGz zXv&n*1;?yIMyMHOn!u?>|NGeaGvvuuHlyj`9S2HlPAZr3&(9=@uHAdw6`U_3Q=avI zUEPngoYpicXPI~kFSbu2zYqP^P7)RSP&Zn?cjRv!)w#dZ_SM%oAh=`PBaJ^HG$rs0 z{|L%lMfO_UIr96h53~l*kHcmeQ~9y;K#Y3>;i+8q@lM)L^(ZT^wjY)0b3nfErg26m zsaVQSv1j#i??vKXqL87B@|T1Z^YPw@E2G(`1QqMYV)(xjw9 zAUB%GA<|Z8n~cjFMs|JTZbvcV(LJ}dXqMvCud;{u#}-oV#AfNW;X`PWvp@5$^6l4e zJId|GW{#Orp8OpS9!%D~Ik!Chz=S|OFZS{)H+iyJ$Hv??k7@Gc`Jy1lAAC0!Pl`xh zI%o&*m9=l%0$A*iW49SQ!we@;o7X}TH@d$T={KEL-(Pf)_w)7hZU(;QMoY(G3S|k) zcp1hVafQAWsTglWR_eU362rZ*q>$!i#C=+0J(lrvAkeT|hEUOC_)(jt_r>B4OLeuy zzW8RReL&tQ!XeyK7VrNs(;(4!`S`E)+2QyCbsEW`y5|~F0;&%ylHV~Re-Naw=Z}_b z>2y;3I`I*nRtew(@cFIDZ}2w}O~R@=rie(Bb?5QSgrb77Ut5nDLs=Du*R4t~1%5uY zvVmovE6Alyjd7v^XfBn~T`3yJ4gf>>nKyIH6qFMV#`Iq68A4nYqF^3KRUtxZgDJ|F z+tl7ZzrCqbU`%vv&@MMuGsn6!!_GprHFZg}d2aFd@Eux9v z&sw-4cZCNdy&cT#YU&8@^Wb}uV}BUeT-8KRAf=3@IH$FbH|Vxbv*@gg`Y!;3l;M=Edp$b}oPYiaHBRO?w&B(65|k-5?Y(8+^}Th4c&g$tuJW6!9|Ks*W zg!4$;a(zpBs9(BUsNmLM$9DP7>Ot89r=mjND(HXJI)~{>U0P2V#g#LnS1d)Z^q%3b ziCI==QMTPz(%IaTHr*MvoiXfXa7$%MQST`57u97=qt%R)%uKfYSGk0Ent#yqr_OQe znFU4K(Q;>wla#Kg5_3jsO(SW}mV#kXz?hepl)ch!ON#xgEgz6d%M^=5iJi5_qk)OsNUW6A zmF)#6cDzc-cXsSUjQj-`6(^JL+#VV!HFoUejBFTejsu(q5?_cUrR05976zkieM&Q) zE(5gADaKhCcKg6id}tqV$+o>>Q68Gg>+3h~PI8d2rLn%kY3CvA#$T0X%KtR`s0q`l z+iF1ja&KaX3d%*gF|U3-oxIC8_1Q$JQ}~Y>ZiHk;1;W?u9=3Ltn7ihLW2P86-C>y4Y$!8WWNg-|-A%5E=Aat`l2`eOL_RXs8NnM~fiwOU zxaoM3$y<4zl|&N;KC27%j7y7zv&U3bef6Hm2`zmFWPKp;jmR7ck!#;l3y<4vgpE`s!g+ia!J;4|Sz{)))C=-R1iJG+YnbbmI=oxgSirDsK5Ks*6L+!HG zg{F5DgkgM>Cj`^u<4L3Oc>_uP5p~H+7mmPp%h1`AzK76*II|srVX3)p{Vdtv7yXK- z4}sJaGhWN!my2uy*7 zF^6ZsP|}KKZiHNsk=2;)jn2yF@%g4ip^2AX?$X+-FcpP07nYQCcckyAV(a?topvX~ zm9=;3xt*Xf0(9c*&zkG}aan=ow!uUd*w^=}_Et;u+Ma6T*sB~c<6UoZA-HxykyFWy zKZhCMdSTS88|XFNIKY&Ne*W&+5hpEu$^Dxdl+H8+{OUYG_L zP*X%0X) zSen3Gp5)jq^FxXAuerQG#|G&Ve!I)$Nel!{e$P{kM~N+}rlvM*k@kT!G8`W>Q>Nw% zF;Azubm&cV>y&S_A>Apb-ARWkhNwoMaPU#!-hr^x?q7GT-;AeJ@|w*(kiNGF3~c4BB=|w*l8~)OKG&?wm>b6dI-FM zUmfrRnAA?N=G5W8=nJvI4-3v?LrD9ap44g;IM;D{W_}4cqB2fDcS!(b9k_OB(PM8e z>^^R6Y<8|dR~oqolX+B3X_GG1uEdVsx`0Slb0{_JLg;{O8ms>8B4Nr<+2W$`#ruuGz}1Lr`=E46nDRkzOiGbWv^R zLNVrghP#!MXiY}7ssMLq?^p2*-e7Yv#v3OWj+G7iR!y!TgFcm?F*5JHRrb`U{Ik0R zaKHS`^wRl4sLm8$H;>7H zG5}WS-CndAtUBF~i-D`NWci~o@YdXkcIL8e;jQPaaimIcK=N_%Vb5%-)!SWfjK6^k zgI%0AFFY_~;-=kn>MIRV6J=T%X36 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 diff --git a/docs/docs/settings/SSO.md b/docs/docs/settings/SSO.md index 4540551fc8..636c8b6d17 100644 --- a/docs/docs/settings/SSO.md +++ b/docs/docs/settings/SSO.md @@ -14,21 +14,21 @@ InvenTree provides the possibility to use 3rd party services to authenticate use ## SSO Configuration -The basic requirements for configuring SSO are outlined below: +The basic steps for configuring SSO are: -1. Enable backend for each required SSO provider(s) in the [config file or environment variables](../start/config.md#single-sign-on). -1. Create an external *app* with your provider of choice -1. Add the required client configurations as a *Social application* in the [Database Admin interface](./db_admin.md). -1. Configure the *callback* URL for the external app. -1. Enable SSO for the users in the [global settings](../settings/global.md). -1. Configure [e-mail](../settings/email.md). +1. Add the backend for the intended SSO provider(s) in the [config file](../start/config.md#configuration-file) or environment variables. +2. Create an external *app* with the provider of choice +3. Add the required client configurations as a *Social application* in the [Database Admin interface](./db_admin.md). +4. Configure the *callback* URL for the external app. +5. Enable SSO for the users in the [global settings](../settings/global.md). +6. Configure [e-mail](../settings/email.md). !!! info "Two-step setup" - Provider modules are enabled in `config.yaml` (or environment variables). Client IDs, secrets, and site assignments are **not** configured there — they must be added as *Social applications* in the [Database Admin interface](./db_admin.md). SSO providers cannot be configured via the InvenTree API. + Provider modules are enabled in `config.yaml` (or environment variables). Client IDs, secrets, and site assignments are configured there or in the database via the Admin Center or the [Database Admin interface](./db_admin.md). -### Enable Provider Backends +### Add Provider Backends -The first step is to ensure that the required provider modules are installed, via your installation [configuration file](../start/config.md#single-sign-on). +The first step is to ensure that the required provider modules are installed, via the installations [configuration file](../start/config.md#single-sign-on). There are two variables in the configuration file which define the operation of SSO: @@ -41,14 +41,10 @@ In the example below, SSO provider modules are activated for *google*, *github* {{ image("settings/sso_config.png", "SSO Config") }} -!!! info "Provider Module Format" - Note that the provider modules specified in `social_backends` must be prefixed with `allauth.socialaccounts.providers` - !!! warning "Provider Documentation" We do not provide any specific documentation for each provider module. Please refer to the [django-allauth documentation](https://docs.allauth.org/en/latest/socialaccount/providers/index.html) for more information. -!!! tip "Restart Server" - As the [configuration file](../start/config.md) is only read when the server is launched, ensure you restart the server after editing the file. +As the [configuration file](../start/config.md) is only read when the server is launched, ensure you restart the server after editing the file. ### Create Provider App @@ -64,40 +60,32 @@ In general, the external app will generate a *key* and *secret* pair - although ### Add Client Configurations -Once your external SSO app has been created, you need to create a new *Social application* entry in the [Database Admin interface](./db_admin.md) (under **Social accounts** → **Social applications** — not in the Admin Center). +Once you have added the provider, you need to create a new *Social application* entry in the Admin Center (under Identity Federation / SSO ) or in the [Database Admin interface](./db_admin.md) (under **Social accounts** → **Social applications**). -#### Create Social Application +#### Admin Database Interface -Select **Add social application** (top right of the social applications list). Social applications are listed under the **Social accounts** section of the Database Admin — not in the InvenTree Admin Center settings screens. +1. Select **Add social application** (top right of the social applications list). Social applications are listed under the **Social accounts** section. -{{ image("settings/social_account_add.png", "Database Admin — Social applications section") }} +2. Configure the social application entry with the specifics provider details: -#### Configure Social Application - -Configure the social application entry with the app details: - -{{ image("settings/social_application_configure.png", "Configure Social Application") }} +{{ image("settings/social_application_configure.png", "Sample Social Application Configuration") }} - Select the *provider* type as required -- Provide a *name* for the application (note that this should match the *name* used for any custom settings provided in the configuration file) -- Add client and secret data for your external SSO app +- Provide a *name* for the social application (note that this must match the *name* used for any custom settings provided in the configuration file) +- Add client and secret data from your external SSO provider / application - Add the *site* which you want to provide access for this SSO app -- Save the new application entry when configuration is finished +- Save the new entry !!! warning "Site Selection" You *must* assign the new application to at least one available site domain -!!! tip "Fix Your Mistakes" - You can always return to edit or adjust the social application details later - -!!! success "Multiple Applications" - To provide support for multiple SSO applications, simply repeat this process and create another social application entry +Multiple SSO applications can be configured by repeating this process and creating multiple entries. ### Configure Callback URL -The external SSO application must be provided with a *callback* URL - a URL by which it can communicate with the InvenTree server. The specific *name* that the external SSO application uses for this callback URL may vary, with some authentication applications referring to it with other names such as *reply* or *redirect*. +Most external SSO providers must be provided with a *callback* URL - a URL by which it can communicate with the InvenTree server. The specific *name* that the external SSO application uses for this callback URL may vary, with some authentication applications referring to it with other names such as *reply* or *redirect*. -In any case, the URL is is specific to your installation and the SSO provider. The general pattern for this URL is: `{% raw %}/accounts//login/callback/{% endraw %}`. +In any case, the URL is is specific to your installation and the SSO provider. The general pattern for this URL is: `{% raw %}/accounts//login/callback/{% endraw %}` but can vary. Read the specific provider documentation by django-allauth for exact information. !!! success "Works for Local Installs" Your server does not need to be "public facing" for this to work. For example the URL `http://localhost:1234/accounts/github/login/callback/` would be perfectly valid! @@ -114,7 +102,7 @@ Now that the social application is created, you need to enable SSO authenticatio In the [settings screen](./global.md), navigate to the *Login Settings* panel. Here you will see the required configuration options to enable SSO: -{{ image("settings/sso_settings.png", "SSO Settings") }} +{{ image("settings/social_account_add.png", "Database Admin — Social applications section") }} | Name | Description | Default | Units | | ---- | ----------- | ------- | ----- | diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 6c944666b2..993d917796 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,14 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 542 +INVENTREE_API_VERSION = 543 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v543 -> 2026-09-05 : https://github.com/inventree/InvenTree/pull/12762 + - Adds admin APIs for managing SSO applications + v542 -> 2026-09-03 : https://github.com/inventree/InvenTree/pull/12731 - Adds management APIs for oAuth2 provider applications diff --git a/src/backend/InvenTree/InvenTree/metadata.py b/src/backend/InvenTree/InvenTree/metadata.py index d74645aa05..3b2c7e0838 100644 --- a/src/backend/InvenTree/InvenTree/metadata.py +++ b/src/backend/InvenTree/InvenTree/metadata.py @@ -492,3 +492,4 @@ class InvenTreeMetadata(SimpleMetadata): InvenTreeMetadata.label_lookup[DependentField] = 'dependent field' +InvenTreeMetadata.label_lookup[serializers.JSONField] = 'json' diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index e91ab59408..36bad35440 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -786,11 +786,6 @@ SITE_MULTI = get_boolean_setting('INVENTREE_SITE_MULTI', 'site_multi', False) # If a SITE_ID is specified SITE_ID = get_setting('INVENTREE_SITE_ID', 'site_id', 1 if SITE_MULTI else None) -# Load the allauth social backends -SOCIAL_BACKENDS = get_setting( - 'INVENTREE_SOCIAL_BACKENDS', 'social_backends', [], typecast=list -) - if not SITE_MULTI: INSTALLED_APPS.remove('django.contrib.sites') @@ -986,8 +981,16 @@ else: FRONTEND_SETTINGS = config.get_frontend_settings(debug=DEBUG) FRONTEND_URL_BASE = FRONTEND_SETTINGS['base_url'] +# Load the allauth social backends +SOCIAL_BACKENDS = get_setting( + 'INVENTREE_SOCIAL_BACKENDS', 'social_backends', [], typecast=list +) + +DEFAULT_SOCIAL = ['saml', 'openid_connect'] +_SOCIAL_BACKENDS = {*DEFAULT_SOCIAL, *SOCIAL_BACKENDS} + # region auth -for app in SOCIAL_BACKENDS: # pragma: no cover +for app in _SOCIAL_BACKENDS: # pragma: no cover # Ensure that the app starts with 'allauth.socialaccount.providers' social_prefix = 'allauth.socialaccount.providers.' @@ -996,9 +999,12 @@ for app in SOCIAL_BACKENDS: # pragma: no cover INSTALLED_APPS.append(app) -SOCIALACCOUNT_PROVIDERS = get_setting( +SOCIALACCOUNT_PROVIDERS = {a: {} for a in DEFAULT_SOCIAL} +_PROVIDER_SETTINGS = get_setting( 'INVENTREE_SOCIAL_PROVIDERS', 'social_providers', None, typecast=dict ) +if _PROVIDER_SETTINGS and isinstance(_PROVIDER_SETTINGS, dict): + SOCIALACCOUNT_PROVIDERS.update(_PROVIDER_SETTINGS) SOCIALACCOUNT_STORE_TOKENS = True diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index 21014008cb..1548a2a2d4 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -18,6 +18,8 @@ from django.views.decorators.csrf import csrf_exempt import django_filters.rest_framework.filters as rest_filters import django_q.models import django_q.tasks +from allauth.socialaccount import providers +from allauth.socialaccount.models import SocialApp from django_filters.rest_framework.filterset import FilterSet from djmoney.contrib.exchange.models import ExchangeBackend, Rate from drf_spectacular.utils import ( @@ -1765,6 +1767,92 @@ class ObservabilityEnd(CreateAPI): return Response({'status': 'ok'}) +class SocialAppSerializer(serializers.ModelSerializer): + """Serializer for SocialApp records.""" + + provider = serializers.ChoiceField(label=_('Provider'), choices=[]) + name = serializers.CharField( + label=_('Name'), + help_text=_( + 'Human friendly name for the application - will be displayed to users' + ), + ) + provider_id = serializers.CharField( + label=_('Provider ID'), + help_text=_( + 'Unique identifier - required for generic providers that can be configured multiple times such as SAML or OpenID Connect' + ), + required=False, + allow_blank=True, + ) + + class Meta: + """Meta options for SocialAppSerializer.""" + + model = SocialApp + fields = [ + 'id', + 'name', + 'provider', + 'provider_id', + 'client_id', + 'secret', + 'settings', + ] + read_only_fields = ['id'] + + def __init__(self, *args, **kwargs): + """Populate provider choices from the active allauth registry.""" + super().__init__(*args, **kwargs) + self.fields['provider'].choices = providers.registry.as_choices() + + def validate_provider(self, value): + """Ensure the selected provider is supported by the active allauth registry.""" + if value not in [provider[0] for provider in providers.registry.as_choices()]: + raise serializers.ValidationError(_('Provider is not supported')) + return value + + def validate(self, data): + """Ensure that the provider is unique across all SocialApp records.""" + provider = data.get('provider', None) + if ( + provider + and SocialApp.objects.filter(provider=provider).exists() + and provider not in ('saml', 'openid_connect') + ): + raise serializers.ValidationError({ + 'provider': _('A SocialApp with this provider already exists') + }) + + if provider == 'saml': + settings = data.get('settings') or {} + idp = settings.get('idp') or {} + has_metadata = bool(idp.get('metadata_url')) + has_inline_metadata = all( + idp.get(field) for field in ('sso_url', 'slo_url', 'x509cert') + ) + + if not has_metadata and not has_inline_metadata: + raise serializers.ValidationError({ + 'settings': _( + 'Provide an IdP metadata URL, or configure the IdP ' + 'SSO URL, SLO URL, and X.509 certificate.' + ) + }) + + return data + + +class SocialAppViewSet(CleanModelViewSet): + """Manage a SocialApp (client side) application.""" + + queryset = SocialApp.objects.all() + serializer_class = SocialAppSerializer + + +admin_router.register('sso', SocialAppViewSet, basename='api-sso') + + class ApplicationViewSet(CleanModelViewSet): """Manage a oAuth2 (provider side) application.""" diff --git a/src/backend/InvenTree/common/test_api.py b/src/backend/InvenTree/common/test_api.py index 3c7d831992..fc12d89902 100644 --- a/src/backend/InvenTree/common/test_api.py +++ b/src/backend/InvenTree/common/test_api.py @@ -9,6 +9,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.test.utils import override_settings from django.urls import reverse +from allauth.socialaccount import providers from PIL import Image from taggit.models import Tag @@ -56,6 +57,101 @@ class DataOutputAPITests(InvenTreeAPITestCase): self.assertEqual(len(response.data), 5) +class SocialAppAPITests(InvenTreeAPITestCase): + """Tests for the SocialApp API serializer.""" + + roles = 'all' + + def test_provider_choices_and_validation(self): + """Provider choices should come from the allauth registry and reject invalid values.""" + from common.api import SocialAppSerializer + + available = [provider[0] for provider in providers.registry.as_choices()] + + serializer = SocialAppSerializer() + provider_field = serializer.fields['provider'] + + self.assertDictEqual( + dict(provider_field.choices), dict(providers.registry.as_choices()) + ) + self.assertCountEqual(available, list(provider_field.choices.keys())) + + url = reverse('api-sso-list') + options = self.options(url) + actions = options.data['actions']['GET'] + + self.assertIn('provider', actions) + self.assertCountEqual( + [choice['value'] for choice in actions['provider']['choices']], available + ) + self.assertEqual( + { + choice['value']: choice['display_name'] + for choice in actions['provider']['choices'] + }, + dict(providers.registry.as_choices()), + ) + + invalid = SocialAppSerializer( + data={'name': 'Bad Provider', 'provider': 'not-a-provider'} + ) + self.assertFalse(invalid.is_valid()) + self.assertIn('provider', invalid.errors) + + def test_saml_idp_configuration(self): + """SAML apps require metadata or a complete inline IdP configuration.""" + from common.api import SocialAppSerializer + + common = { + 'name': 'SAML App', + 'provider': 'saml', + 'provider_id': 'saml-provider', + 'client_id': 'saml-org', + } + + metadata = SocialAppSerializer( + data={ + **common, + 'settings': { + 'idp': { + 'entity_id': 'https://idp.example.com', + 'metadata_url': 'https://idp.example.com/metadata', + } + }, + } + ) + self.assertTrue(metadata.is_valid(), metadata.errors) + + inline = SocialAppSerializer( + data={ + **common, + 'settings': { + 'idp': { + 'entity_id': 'https://idp.example.com', + 'sso_url': 'https://idp.example.com/sso', + 'slo_url': 'https://idp.example.com/slo', + 'x509cert': 'certificate', + } + }, + } + ) + self.assertTrue(inline.is_valid(), inline.errors) + + incomplete = SocialAppSerializer( + data={ + **common, + 'settings': { + 'idp': { + 'entity_id': 'https://idp.example.com', + 'sso_url': 'https://idp.example.com/sso', + } + }, + } + ) + self.assertFalse(incomplete.is_valid()) + self.assertIn('settings', incomplete.errors) + + class ParameterAPITests(InvenTreeAPITestCase): """Tests for the Parameter API.""" diff --git a/src/frontend/lib/enums/ApiEndpoints.tsx b/src/frontend/lib/enums/ApiEndpoints.tsx index 824e881650..1e7d2da8e4 100644 --- a/src/frontend/lib/enums/ApiEndpoints.tsx +++ b/src/frontend/lib/enums/ApiEndpoints.tsx @@ -266,6 +266,7 @@ export enum ApiEndpoints { scim_generate = 'admin/scim/generate/', scim_disable = 'admin/scim/disable/', config_list = 'admin/config/', + sso_list = 'admin/sso/', parameter_list = 'parameter/', parameter_template_list = 'parameter/template/', tag_list = 'tag/', diff --git a/src/frontend/lib/types/Forms.tsx b/src/frontend/lib/types/Forms.tsx index 48323dd6a0..4fdbba6e7e 100644 --- a/src/frontend/lib/types/Forms.tsx +++ b/src/frontend/lib/types/Forms.tsx @@ -100,7 +100,8 @@ export type ApiFormFieldType = { | 'nested object' | 'dependent field' | 'table' - | 'tags'; + | 'tags' + | 'json'; api_url?: string; pk_field?: string; model?: ModelType; diff --git a/src/frontend/lib/types/Tables.tsx b/src/frontend/lib/types/Tables.tsx index f058617752..66f89efb40 100644 --- a/src/frontend/lib/types/Tables.tsx +++ b/src/frontend/lib/types/Tables.tsx @@ -184,6 +184,7 @@ export type RowViewProps = RowAction & RowModelProps & RowViewBehaviorProps; * @param barcodeActions : any[] - List of barcode actions * @param tableFilters : TableFilter[] - List of custom filters * @param tableActions : any[] - List of custom action groups + * @param tableActionsFullWidth : boolean - Allow custom table actions to use the available header width * @param isRecordSelectable : (record: any, index: number) => boolean - Callback function to determine if a row is selectable * @param detailAction: boolean - Enable detail action for each row (default = true) * @param dataFormatter : (data: any) => any - Callback function to reformat data returned by server (if not in default format) @@ -216,6 +217,7 @@ export type InvenTreeTableProps = { barcodeActions?: React.ReactNode[]; tableFilters?: TableFilter[]; tableActions?: React.ReactNode[]; + tableActionsFullWidth?: boolean; isRecordSelectable?: (record: T, index: number) => boolean; rowExpansion?: DataTableRowExpansionProps; dataFormatter?: (data: any) => any; diff --git a/src/frontend/src/components/forms/fields/ApiFormField.tsx b/src/frontend/src/components/forms/fields/ApiFormField.tsx index 3212c3ed89..de4dcd5255 100644 --- a/src/frontend/src/components/forms/fields/ApiFormField.tsx +++ b/src/frontend/src/components/forms/fields/ApiFormField.tsx @@ -16,6 +16,7 @@ import { ChoiceField } from './ChoiceField'; import DateField from './DateField'; import { DependentField } from './DependentField'; import IconField from './IconField'; +import { JsonField } from './JsonField'; import { NestedObjectField } from './NestedObjectField'; import NumberField from './NumberField'; import { RelatedModelField } from './RelatedModelField'; @@ -295,6 +296,15 @@ export function ApiFormField({ return ( ); + case 'json': + return ( + + ); default: return ( diff --git a/src/frontend/src/components/forms/fields/JsonField.tsx b/src/frontend/src/components/forms/fields/JsonField.tsx new file mode 100644 index 0000000000..a8a62836f0 --- /dev/null +++ b/src/frontend/src/components/forms/fields/JsonField.tsx @@ -0,0 +1,75 @@ +import type { ApiFormFieldType } from '@lib/types/Forms'; +import { JsonInput } from '@mantine/core'; +import { useId } from '@mantine/hooks'; +import { memo, useCallback, useMemo } from 'react'; +import type { FieldValues, UseControllerReturn } from 'react-hook-form'; + +function JsonFieldComponent({ + controller, + definition, + fieldName, + onChange +}: Readonly<{ + controller: UseControllerReturn; + definition: ApiFormFieldType; + fieldName: string; + onChange: (value: any) => void; +}>) { + const fieldId = useId(); + + const { + field, + fieldState: { error } + } = controller; + const { value } = field; + + const formattedValue = useMemo(() => { + if (value === undefined || value === null) { + return ''; + } + + if (typeof value === 'string') { + return value; + } + + if (typeof value === 'object') { + return JSON.stringify(value, null, 2); + } + + return String(value); + }, [value]); + + const handleChange = useCallback( + (nextValue: string) => { + if (nextValue.trim() === '') { + onChange(undefined); + return; + } + + try { + onChange(JSON.parse(nextValue)); + } catch { + onChange(nextValue); + } + }, + [onChange] + ); + + console.log('error', error, 'definition.error', definition.error); + + return ( + + ); +} + +export const JsonField = memo(JsonFieldComponent); diff --git a/src/frontend/src/components/tables/InvenTreeTableHeader.tsx b/src/frontend/src/components/tables/InvenTreeTableHeader.tsx index 666c269754..6fc6fe4121 100644 --- a/src/frontend/src/components/tables/InvenTreeTableHeader.tsx +++ b/src/frontend/src/components/tables/InvenTreeTableHeader.tsx @@ -217,8 +217,22 @@ export default function InvenTreeTableHeader({ onClose={() => clearQueryFilters()} /> )} - - + + {group} ))} - + {!tableProps.tableActionsFullWidth && } {tableProps.enableSearch && ( (''); @@ -199,10 +202,363 @@ function ScimManagementPanel() { function SSOManagementPanel() { const navigate = useNavigate(); + const { getHost } = useLocalState(); + const table = useTable('sso-applications', { idAccessor: 'id' }); + const [oidcCallback, setOidcCallback] = useState(null); + const [samlUrls, setSamlUrls] = useState<{ + acs: string; + sls: string; + metadata: string; + } | null>(null); + const [selectedSsoApplication, setSelectedSsoApplication] = useState< + number | undefined + >(undefined); + + const newGenericSsoApplication = useCreateApiFormModal({ + url: ApiEndpoints.sso_list, + title: t`Add SSO Application`, + table: table, + fields: { + name: {}, + provider: {}, + provider_id: {}, + client_id: {}, + secret: {}, + settings: {} + } + }); + + const newOidcSsoApplication = useCreateApiFormModal({ + url: ApiEndpoints.sso_list, + title: t`Add OIDC SSO Application`, + table: table, + fields: { + provider: { + hidden: true, + value: 'openid_connect' + }, + name: {}, + provider_id: { required: true }, + client_id: {}, + secret: { required: true }, + oauth_pkce_enabled: { + field_type: 'boolean', + label: t`OAuth PKCE Enabled`, + description: t`Use Proof Key for Code Exchange during OIDC login with this application`, + default: true + }, + server_url: { + field_type: 'string', + label: t`OIDC Server URL`, + description: t`Base URL of the OIDC provider` + }, + uid_field: { + field_type: 'string', + label: t`UID Field`, + description: t`OIDC claim used as the user's unique identifier`, + default: 'sub' + } + }, + processFormData: (data) => { + const { oauth_pkce_enabled, server_url, uid_field, ...applicationData } = + data; + + return { + ...applicationData, + settings: { + oauth_pkce_enabled, + server_url, + uid_field + } + }; + }, + onFormSuccess: (data) => { + setOidcCallback( + new URL( + `/accounts/oidc/${data.provider_id}/login/callback/`, + getHost() + ).toString() + ); + } + }); + + const newSamlSsoApplication = useCreateApiFormModal({ + url: ApiEndpoints.sso_list, + title: t`Add SAML SSO Application`, + table: table, + fields: { + provider: { + hidden: true, + value: 'saml' + }, + name: { + label: t`Name`, + description: t`Display name for this SAML identity provider` + }, + provider_id: { + required: true, + label: t`Provider ID`, + description: t`Unique provider identifier, normally the IdP entity ID` + }, + client_id: { + required: true, + label: t`Organization Slug`, + description: t`URL-safe identifier used in SAML login and metadata URLs` + }, + idp: { + field_type: 'nested object', + label: t`Identity Provider Settings`, + children: { + entity_id: { + field_type: 'string', + required: true, + label: t`IdP Entity ID`, + description: t`Entity ID of the SAML identity provider` + }, + metadata_url: { + field_type: 'url', + label: t`IdP Metadata URL`, + description: t`Use this or provide the inline IdP settings below` + }, + sso_url: { + field_type: 'url', + label: t`IdP SSO URL`, + description: t`Inline IdP single sign-on URL` + }, + slo_url: { + field_type: 'url', + label: t`IdP SLO URL`, + description: t`Inline IdP single logout URL` + }, + x509cert: { + field_type: 'string', + label: t`IdP X.509 Certificate`, + description: t`Inline IdP signing certificate` + } + } + }, + sp: { + field_type: 'nested object', + label: t`Service Provider Settings`, + children: { + entity_id: { + field_type: 'string', + label: t`SP Entity ID`, + description: t`Optional service provider entity ID` + } + } + }, + account: { + field_type: 'nested object', + label: t`Account Mapping`, + children: { + attribute_mapping: { + field_type: 'json', + label: t`Attribute Mapping`, + description: t`Map SAML attributes to uid, email, and email_verified` + }, + use_nameid_for_email: { + field_type: 'boolean', + label: t`Use NameID for Email`, + description: t`Use the SAML NameID value as the user's email address` + } + } + } + }, + processFormData: (data) => { + const { idp, sp, account, ...applicationData } = data; + + return { + ...applicationData, + settings: { + ...account, + idp, + sp + } + }; + }, + onFormSuccess: (data) => { + const baseUrl = getHost(); + const organization = data.client_id; + + setSamlUrls({ + acs: new URL(`/accounts/saml/${organization}/acs/`, baseUrl).toString(), + sls: new URL(`/accounts/saml/${organization}/sls/`, baseUrl).toString(), + metadata: new URL( + `/accounts/saml/${organization}/metadata/`, + baseUrl + ).toString() + }); + } + }); + + const editSsoApplication = useEditApiFormModal({ + url: ApiEndpoints.sso_list, + pk: selectedSsoApplication, + title: t`Edit SSO Application`, + table: table, + fields: { + name: {}, + provider: {}, + provider_id: {}, + client_id: {}, + secret: {}, + settings: {} + } + }); + + const deleteSsoApplication = useDeleteApiFormModal({ + url: ApiEndpoints.sso_list, + pk: selectedSsoApplication, + title: t`Delete SSO Application`, + table: table + }); + + const ssoColumns = useMemo( + () => [ + { + accessor: 'name', + title: t`Name`, + sortable: true, + switchable: false + }, + { + accessor: 'provider', + title: t`Provider`, + sortable: true, + switchable: true + }, + { + accessor: 'provider_id', + title: t`Provider ID`, + sortable: true, + switchable: true + }, + { + accessor: 'client_id', + title: t`Client ID`, + sortable: true, + switchable: true + } + ], + [] + ); + + const rowActions = useCallback( + (record: any): RowAction[] => [ + RowEditAction({ + onClick: () => { + setSelectedSsoApplication(record.id); + editSsoApplication.open(); + } + }), + RowDeleteAction({ + onClick: () => { + setSelectedSsoApplication(record.id); + deleteSsoApplication.open(); + } + }) + ], + [deleteSsoApplication, editSsoApplication] + ); + + const tableActions = useMemo( + () => [ + , + , + + ], + [newGenericSsoApplication, newOidcSsoApplication, newSamlSsoApplication] + ); return ( - TBD + + + Frontend Single Sign-On (SSO) is based on django-allauth. By default + generic OIDC (client) and SAML providers are enabled. +
    + You can add more specific providers using the + `INVENTREE_SOCIAL_BACKENDS` config key. After a restart those + providers become available below. +
    + The documentation goes more in depth on SSO setup steps. +
    +
    + {newGenericSsoApplication.modal} + setOidcCallback(null)} + title={{t`OIDC Callback URL`}} + centered + > + + {t`Add this callback URL to your OIDC provider.`} + + + {oidcCallback} + + + + + + setSamlUrls(null)} + title={{t`SAML Service URLs`}} + centered + > + + {t`Register these URLs with your SAML identity provider.`} + Endpoint, URL], + body: [ + [ACS, samlUrls?.acs], + [SLS, samlUrls?.sls], + [Metadata, samlUrls?.metadata] + ] + }} + /> + + + {newOidcSsoApplication.modal} + {newSamlSsoApplication.modal} + {editSsoApplication.modal} + {deleteSsoApplication.modal} + Date: Mon, 7 Sep 2026 19:25:37 +1000 Subject: [PATCH 2/3] [UI] Specify min width for search input (#12810) --- src/frontend/lib/components/SearchInput.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/lib/components/SearchInput.tsx b/src/frontend/lib/components/SearchInput.tsx index 740c763719..7e5adbbee2 100644 --- a/src/frontend/lib/components/SearchInput.tsx +++ b/src/frontend/lib/components/SearchInput.tsx @@ -33,6 +33,7 @@ export function SearchInput({ leftSection={} placeholder={placeholder ?? t`Search`} onChange={(event) => setValue(event.target.value)} + style={{ minWidth: '150px' }} rightSection={ value.length > 0 ? ( Date: Mon, 7 Sep 2026 21:08:02 +1000 Subject: [PATCH 3/3] [bug] Prevent editing of model-type for data import (#12809) --- src/backend/InvenTree/importer/serializers.py | 11 ++++ src/backend/InvenTree/importer/tests.py | 66 +++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/backend/InvenTree/importer/serializers.py b/src/backend/InvenTree/importer/serializers.py index 566322e310..f297e46cb9 100644 --- a/src/backend/InvenTree/importer/serializers.py +++ b/src/backend/InvenTree/importer/serializers.py @@ -90,6 +90,17 @@ class DataImportSessionSerializer(InvenTreeModelSerializer): user_detail = UserSerializer(source='user', read_only=True, many=False) + def validate_model_type(self, value): + """Prevent the target model type from being changed after creation.""" + if self.instance is not None and self.instance.model_type != value: + raise ValidationError( + _( + 'Model type cannot be changed after the import session has been created' + ) + ) + + return value + def validate_field_defaults(self, defaults): """De-stringify the field defaults.""" if defaults is None: diff --git a/src/backend/InvenTree/importer/tests.py b/src/backend/InvenTree/importer/tests.py index dc96119df7..04757fbeac 100644 --- a/src/backend/InvenTree/importer/tests.py +++ b/src/backend/InvenTree/importer/tests.py @@ -744,6 +744,72 @@ class ImportAPITest(ImporterMixin, InvenTreeAPITestCase): self.assignRole('purchase_order.change') self.post(url, expected_code=200) + def test_model_type_immutable(self): + """Test that a session's model_type cannot be changed after creation. + + Regression test for a security report (dev/todo/import-retarget.md) where a + user could create a session against a model they have permission for, then + retarget it (via PATCH) to a different model they do not have permission for - + bypassing the permission checks which are resolved against the model type at + the time they run, rather than the model type the session was created against. + """ + f = self.helper_file('companies.csv') + + session = DataImportSession.objects.create( + data_file=f, model_type='company', user=self.user + ) + + # 'company' is part of the 'purchase_order' ruleset + self.assignRole('purchase_order.change') + + url = reverse('api-import-session-detail', kwargs={'pk': session.pk}) + + # Attempting to retarget the session to a different model is rejected + response = self.patch(url, {'model_type': 'partcategory'}, expected_code=400) + self.assertIn('model_type', response.data) + + session.refresh_from_db() + self.assertEqual(session.model_type, 'company') + + # Re-submitting the *same* model_type value is not treated as a change + self.patch(url, {'model_type': 'company'}, expected_code=200) + + def test_retarget_permission_bypass(self): + """Test that retargeting a session cannot be used to bypass model permissions. + + Regression test for a security report (dev/todo/import-retarget.md): + a user with permission for one model (e.g. purchase orders) must not be able + to accept the field mapping for that model, then retarget the session to a + different model (e.g. part categories) for which they have no permission. + """ + from part.models import PartCategory + from users.permissions import check_user_permission + + f = self.helper_file('companies.csv') + + session = DataImportSession.objects.create( + data_file=f, model_type='company', user=self.user + ) + + # Grant permission for 'company' (via the 'purchase_order' ruleset) only + self.assignRole('purchase_order.change') + + # Sanity check: the user has no part_category permissions + self.assertFalse(check_user_permission(self.user, PartCategory, 'change')) + + # The user is permitted to accept the field mapping for the model they have access to + accept_fields_url = reverse( + 'api-import-session-accept-fields', kwargs={'pk': session.pk} + ) + self.post(accept_fields_url, expected_code=200) + + # Attempting to retarget the session to 'partcategory' must be rejected + detail_url = reverse('api-import-session-detail', kwargs={'pk': session.pk}) + self.patch(detail_url, {'model_type': 'partcategory'}, expected_code=400) + + session.refresh_from_db() + self.assertEqual(session.model_type, 'company') + def test_accept_rows_ownership(self): """Test that accept_rows rejects requests for sessions owned by another user.""" other_user = User.objects.create_user(