From 947c1f4991f24f96c5cf5ff5939f7465b91583e4 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Wed, 6 Dec 2023 12:10:22 -1000 Subject: [PATCH] Add full OpenID connect provider support --- bun.lockb | Bin 374984 -> 386144 bytes cli.ts | 69 +++++++ config/config.example.toml | 12 ++ package.json | 4 +- pages/App.vue | 2 +- pages/components/LoginInput.vue | 29 +++ pages/login.vue | 61 ++++-- pages/main.ts | 3 +- pages/uno.css | 155 --------------- pages/vite.config.ts | 2 +- prisma.ts | 14 +- .../20231206215508_add_openid/migration.sql | 20 ++ prisma/schema.prisma | 54 +++-- server/api/auth/login/index.ts | 19 +- server/api/oauth/authorize-external/index.ts | 84 ++++++++ server/api/oauth/authorize/index.ts | 38 ---- server/api/oauth/callback/[issuer]/index.ts | 187 ++++++++++++++++++ server/api/oauth/providers/index.ts | 31 +++ temp/flow_0exywktgkcq6wjwa691mat | 1 + temp/flow_2c0ojqmxbidvqt6g964fnn | 1 + temp/flow_366pnjfy46z7a6ijrv2s2e | 1 + temp/flow_9gk2f91f7rpr4zz1lza4n8 | 1 + temp/flow_9xab9zbynrche1s5oqpko | 1 + temp/flow_adnvd9wrsykciwdbfz9da8 | 1 + temp/flow_b7w5jcwll3tee0l4tq9ejw | 1 + temp/flow_bcw2mcd2l3pbfsvwp4t1tp | 1 + temp/flow_be9y4se653i4ks1qdvhiu5 | 1 + temp/flow_bwluoig4sco7i5jrau0u | 1 + temp/flow_ckkbeibg93nohnk87ljuk | 1 + temp/flow_ggo4fp8ui1ejwinui77ycf | 1 + temp/flow_jp0vw18g9qe63tucqixezt | 1 + temp/flow_llg9kgdkbdmy8m7e023lm | 1 + temp/flow_lp0v28msillw76xmk83sx | 1 + temp/flow_lpmjxmln4o2axlfu9kb0n | 1 + temp/flow_nreir9hwdpjnylbl79ydl | 1 + temp/flow_rx8dih8r80gzhlosl1glw | 1 + temp/flow_thi2f1athskd4cculln0n | 1 + temp/flow_uiahlqg3uolo9x007xwhf | 1 + temp/flow_vf6gxl8c4s6583pxpelsc | 1 + temp/flow_vwgyv1bz05d69quclfqclo | 1 + temp/flow_w39k8p9uvnvcmj61wuzh | 1 + temp/flow_yjmm00zgy1ainhm9i6ggp | 1 + temp/flow_z26sq4gy8aiyfr835akz2d | 1 + utils/config.ts | 14 ++ utils/constants.ts | 6 + utils/oauth.ts | 2 + utils/temp.ts | 20 ++ 47 files changed, 604 insertions(+), 247 deletions(-) create mode 100644 pages/components/LoginInput.vue delete mode 100644 pages/uno.css create mode 100644 prisma/migrations/20231206215508_add_openid/migration.sql create mode 100644 server/api/oauth/authorize-external/index.ts delete mode 100644 server/api/oauth/authorize/index.ts create mode 100644 server/api/oauth/callback/[issuer]/index.ts create mode 100644 server/api/oauth/providers/index.ts create mode 100644 temp/flow_0exywktgkcq6wjwa691mat create mode 100644 temp/flow_2c0ojqmxbidvqt6g964fnn create mode 100644 temp/flow_366pnjfy46z7a6ijrv2s2e create mode 100644 temp/flow_9gk2f91f7rpr4zz1lza4n8 create mode 100644 temp/flow_9xab9zbynrche1s5oqpko create mode 100644 temp/flow_adnvd9wrsykciwdbfz9da8 create mode 100644 temp/flow_b7w5jcwll3tee0l4tq9ejw create mode 100644 temp/flow_bcw2mcd2l3pbfsvwp4t1tp create mode 100644 temp/flow_be9y4se653i4ks1qdvhiu5 create mode 100644 temp/flow_bwluoig4sco7i5jrau0u create mode 100644 temp/flow_ckkbeibg93nohnk87ljuk create mode 100644 temp/flow_ggo4fp8ui1ejwinui77ycf create mode 100644 temp/flow_jp0vw18g9qe63tucqixezt create mode 100644 temp/flow_llg9kgdkbdmy8m7e023lm create mode 100644 temp/flow_lp0v28msillw76xmk83sx create mode 100644 temp/flow_lpmjxmln4o2axlfu9kb0n create mode 100644 temp/flow_nreir9hwdpjnylbl79ydl create mode 100644 temp/flow_rx8dih8r80gzhlosl1glw create mode 100644 temp/flow_thi2f1athskd4cculln0n create mode 100644 temp/flow_uiahlqg3uolo9x007xwhf create mode 100644 temp/flow_vf6gxl8c4s6583pxpelsc create mode 100644 temp/flow_vwgyv1bz05d69quclfqclo create mode 100644 temp/flow_w39k8p9uvnvcmj61wuzh create mode 100644 temp/flow_yjmm00zgy1ainhm9i6ggp create mode 100644 temp/flow_z26sq4gy8aiyfr835akz2d create mode 100644 utils/constants.ts create mode 100644 utils/temp.ts diff --git a/bun.lockb b/bun.lockb index 9c4e65df46b350c9a5e5905445eebced79f506e6..cc2d4ad118a6d9de796f321c309f144bb87840f8 100755 GIT binary patch delta 79532 zcmeFa33yG{`}e)iNeH9;v*biTC=(gDUR2y5x_kyV`x;IM^w0X8BJNhbBh0TzGeK-#=&1pMCsi zo5t7Y3kTJ-w%WZg-7B-clcwpKmX#417Z;n7s?D=%T6x$5oi(i@G$z`tq3wmua$TWi zq3xh<(B_K&hL*`Ym(a8_P%p(jp`~D#hPp$0m6Yx8hoXLF)^?f5TCem8I>drkp|3zE zqeHYCL0zE}(`1j_VK6@l%6w*0E8}WaprxRtp@*T>ph<}-sZl8@+IT>=lMtDZ7&|&s z)9zqc z6XW92k~A$kWmH;h+-NNj?xaT>;ztE&B`7=YOpfbk-9hUF=bHXix(ohg{&m>Y&rlxM%K8Y3CbIslD$8AglCJ}&%lBa(sJ7~|gQ>}_GTYFV zQHco&(YVxUWYDEak;y61X~}U%Ve^7%2}!Y-2`wcxGBqtFI%T7$EEgT^GbT1UC3S_e z7em>h(b1#Q#-iQ$6t<4`VB^sJZ@Kk-#2;s7;u_&F$~e`xp(EL;iKB zJ9HJ4>${;{cCa>-QU4{>Ts_ILDe;k-HYiB8`_v*Yd>6|6I_;&#M<$Oq);QPAJk&uJ zaPKH}x3X72tD-_$!sytjSWRoxNj7*xl^dS{H{j)1-;teV2M0m9ijJT>r{t01!BBR* z0GtEz>tdGA%=*|O3yw<}ofwY>fA1;_PEzalA2tqi-$+VJ$cRcD9eo+)>A}-VD}=}n z#6s!v&%x=r0x0bsJ*3B$LEW@gTGpFLa1Mi@ERd8EXO3($DwKkq5}6*&zNE*;VJ}He zd9SPS*j6KRCbDZGdxC2J+g|dzk+38qJ5{VNqvoXN;Js~=r7C1VZ&y>_w|$A zhBwnvW8+f(Qu%kF9Of3}Q}dy0Z$6Z3=1t54hkJgYbVEjD+GILn#2{%8gtB~6bi!y} z=M>7JpVhLG(&Cc{5)-1#d*h_!$fP7h$INgexn!Hn@FCI<@hM}IBBRD9w;C$_b6}XJ zHAZ`jmBv7uzz$G$S*Q=}izwd|`WdtqG%j&;WJ-*tjg3nj#mhPlA+ZTD(aEu?DX|G- z;$p|fq#hV)j>jo0bcoT=rAFp%l;-%-P%aW9SfuQgQ2JxC#9B;Z;`qo>anU8=3l` zDs)uhq?Bm1?E{;esT-6t)|2gKBGF1+AT2G{452EptARhn2x>!bKCPu&u{D2Isp{%^=a%4Ve zz#DdHC_8cq<+yo$4&_K3_13`Vh;pIyLUKD0hG>~%R6POv$`i({njgR;Zn*>V7WPn_aeW@e2_j*Q}Ve^7!fJx^YED3k@` zqm#!*x6m{@@=L*vP4O{zqAp8h$D4qc10NHak~#qwN{&uTi5-)n9Ya1HH~$@Z;j>U~ z|20(ksF=j@cqEBT#=(2^=-A|>txM&F*C@?;R|a!rLPmUKYE+Ell;}7W9>+*H)#aAU z;7^BEhW%)n)H*9RDl904@wu;Un6a2C>O)^)iN}uBA+9qdm`gfv>(>WSl$QaqFMvx8i-fr{#u0v z%H{g+PV9B^qz-F$EfXx_c4@DDM z%QmUC0OdYb^F6FmR{Z;O@lWr|k)GQucT_YN85cP^`b*f1-2y1Li}#`Q$Z(8=!G9d} z%0t({eigd?BYEM@u({}RU^j#&Y}K?D(7s#YfA*v?Kz*nNZ48Y=K{hxQ6}_MbR?1bE zkGbP^uoTLUWJ4Kbo=QK(qT?z~g3VQ$I3^mAqiGv<$ygd4jk^^*GaUKlksq9i1b5hG zPzI9@<;X_umah9k>0T&T!+4&D@zKHiu-U+v*o4tOcmQ_!L{8DOkEJI0#3e>Wrba_! z<6~2`XDS~{J1P<#`1DiR@ysnqaBdS5qEm5D(r{Xejq(|juoj%IO~U&286TaoMA-|V z?8q!AJ)lk{S?RFZ&ZL-F4p@s#!KI*+_Q{|O`AnAo4IbiDT!fazDK`rpGb>KnFM|i$ zO-f>1q?Qbu7mAXnEN%50#$@*znYKeR_MUt$b&j&{D!a{L*-TvY#00dgHHOVt)sM1zhgC4IVNq#K9-4mE|#Cc*}>%4_~ghj|8>mD{Zi(`_qgpNI*Qmn zP8E2TPECy-ttFuW_B=YpJa*zE5IoQ%XJ}o%k_|?uBw^dvvEFplny2&o#@p(zA&;3FG>VEuTqz zX7~;ntY||x8ZQjf#tg+nkBdTPoKvb>u`ZVL%X9EPS%`%#uFdqLK7R+^NS#6_wtJums6D90G< zb`j&J3)f$injFPqn&xnEd~5>NZ%Qh}I9&uFs*XY%ha*PlKqBz#5SRXuyBx>hTk;{;uI%PyAC!ADv z%U@+jmqK4b{u@wsw7$|=Hzkjc9FM2P*yL*9rI0^5G1Vt2IWY;>NgOp!Gn!V?M>V}I zo!|kb_x3C;jK~f7Nvd z=0U|LY5Z7+9sIj&?k6bc;1HDe`RL^2#AKi7bjN2TO~EUHXWWM59Rp>w z-bX&Wq0S*aaFoJMJTY3k{XpJEFGIOieG4taijgUalM--;d?d%S8JPQ}Xfd@8x)*7NNX*-VlT4v#nxB~CJ9R_pytmg@lJl23eO5(;d7E-&DwSNcj4>&@{F|&y%&yX3 z1wdCj3OJTXYgMr}M!+d)QpRE~*GkGh4x7h^SbTaHn;f0|_hW!#N&cNbW>S* z;gwKc0FO3lh;wZrZ1y-+ezu}Tl$YfkpKkG!sL|1>TDGb`9m)YMsvt-F_j`$BO*=Ze zvTWwRUhv;F#4m=DF;$LWO{`=w=Mv9u_y9g3We9BUgnu95mda|%Zp&bGc<{yHKC|YF zRqGR(kP_=S)jL*!!xQhJA$npll-q&BrH);0dNmm{)s&v7DlZ(YI_9`*`opG&nm`$2 znIkZV+^2eDo2Uy-fihT1sk!|_*^a&b?_2#Tv$=AfHp}2-bD5 zxmwg+G!tjOI5-yHY{Z!#XuWXp&$VTPJgSXC6r(Zo8PlbXjDbV1%KQcD0_OP-?RdPp1+(44z(ij3-&j#`Wj=6NKhNyaS z89IW@v793h$_=ZHx5d1jUql<+2hKosqn>AljujhO%tx_v4dsq<7s|N^Xe=jtH|$!l zXQBo*%tw|x1mz^Q@-ZfRwz2MMx^1iHKua^bZ?hgT>%YC=+le z)e{2_-w1o>lY#{^E6={2{bQfF@4J;<+hL)RRkNVa6c7K$v2*&5S#b62k5v|Y{&wHF z-+oXdJjB&{W1fwMlJ>@@8A*M|D91Z&J%e~o4w{Oq? zX>wWL5B_*#me%T0)xyJTwts$l$C)>~8RZ=4<#7=De*xeTq^Yu?WHF9#YPHDml1 z@9eSK#rN|E3tsuKV9EN*ZU@hFzB%LSl)3{(-hBReLFAtYGJ9Q0yzt3z`*7>0-~8tC z!dKg}YA&!CwQ4W$Xy0@|{6#n8&gbtvUpevimhc(=CC`4`W<{@U7i(u(w{DMWZ7WM#m{@jQU4&lsgtI)!%USh+{gRs zv9Q{}a;9Zl0jrx4>hEtEZyXH>vV39afkBqvjqZU#x{poMx}c;*gq5}U8Ap+^!_e(P z`d=!;YAg)&)%%vvw9YJMxX1Xpz~HqsW?7CKdQgx}FR5w4hFg%oZ6s1%&D2*&bu>Z) z{q=G#NTG(+2t$prM)&qXmet1G_CdC*$O$oW+xuIa>qbs{yCu!&-XX|#0C$NdW+U~m zne;GIGmw&(IQ$~j3@d*Cb1k!tqaA}RmkhmAkfoK;y;G2$hFv2-_IbRoWuI}hQ;_X< zuuf)cT@lx^wWUaPFx&XSINCYLQr^&mgWLvTk7~<7;^l5E9N5Tc@9$zOg$3Wt2p#LM z_eF~NuNYyGzE)Az2uZSA&z3cEg6-Ct<&46&?bZ?H4A(_=TW=h(aivB6wzrY$Y7{LB z;P=wqO;i_KRj?7dIKUYRiMApI2crBVGt*53IOFUpGv^=`YUCD2p13dcHp|B$6>6q- zBh}T&%?ohGMj&f;M+)6oQVg8|lI81Gc3g8jQt**RsNTA)VEbhxK0Ie8i3FAbx8DDw_ z(8i=@=i^lwXM>k6fWG~)GhuaY8g2L?0U)C zFZ?jj*E*@TQ5bBum9C>{LyV%X0nSK-8%4qXw!IP|{=Da;7czD?Scj@phmfY zjk)6V%L-xw2m0#0y=44YjT4Bwxv)4;>`H}x8RBiY zcDLJRc*Bi`TX%okA*8yPsZtHOLz4AFO6H0e>;h7VXOwB;52UFJXTNs7C?bfO-4c9()TTd+9!Q}c{q@tuZano=? zlt-968mX}__?NKEwsp_enl|(WPlq+YEMJ7wh!?yuR+!{7koqrv5teMHxo@#{^!czN z9JTf9up%9nEd&uSN3#s6LFU!|K#GgYytPoB`@b9*CXnB8_2#X1|I!~AWHuyM9$N*|9DJM6;MV?EKq2#K&;Jv$mXkcf^(A!J!c z!*#gb`e#QYWVqedu9Kz(8o2}gt&=(#h2TGQGF(U4b-lA(Yw!v@n%vpQ0o?Nf!Z}vg zV8eB!T^|zc*xR{Zu7O2wVxJ21wcUY*xE=4WcZX9$%t3-%jV?w=q+Ndo$h%5qb1$^P znXGDV>(;PthU+N1z8Dam%_?ISIi-q}G_9JriEyu%_krH95GmYPBm7)osA(MUYc1+- z`a+x3k-UTi=Z-A!2V0k47RXolXh zA>3;)rlg)mVYJ=4yrJZ}E-v{okcMc+`b3oIF}obcCRamq?EjI0HrM#xyZ z^-idfGuE!x?WJik$U}&&@^gW~o|ZK4$QNO8GsL|DyJq#?G8Uy{M#JihJOuG{KNlES z3GzN-)%zGBv36^hK1NQg-8QWc_n)E&fBghf92quRjI&~x?5}3t(nDc!4qT0}!M=J9 zEVd`7>GLqdb-dmBG|UJYZ`a%4s)#_Yr3hc^yuL;u;5UG*AQxDfevXAe@Arg77wU%l zDnDl!ZH=Pg{#K{{hHJcC@6umw__%@i>N8=vaZcW}IRN!bx!a zAfqtJuD=h+Vc`t%sh=~9W?cPxrEtf!!zTDS!vMy9^QKH44Ipa8BeV7Qa3d!fXQRO~ z!faeI)=7g6*A%A*4O7g!7?6iM*4dJHiNQDpKE=?+~ibhr39!|H3~M)_Nx z4l#04?Rq*kZmbq~Jq#gtdl)`GdtnWWC~g(PN`8?SFuZu)Mp#KN@~UEUPkmwi0gJ(j zeG6-B*hr&rqFsM$r0kW88J0z`=p#(TFkihS_IW>8a3dx#NLe^GVm>CpqTglw?NAnu zMVR>CVR87F++<(9-Y7>ah%r6lg@w4a9v@|dWY}%5;3fwjXZTyYMVVkaK!8z{5#WLZ zo5BJf<7>ScW#mk@+v<*HE{l&G&EooE0EP6x+KXy)%>t1!kq`x^nyaa?Gj9sF&fNVPI@BmAv1;*7$ncKsp%eS`x~ zu&=FZym`}{ime=}jwa^>9)g7>%8tWZjWL&4|I)HfPB22I+x71N`#PZBI8p9^=F^=u zIni*72j`g?sPk=Ww!-S7&<&*26*1etPBdI!v+I2(Xz84v7SV%tQ_Uk6 z2Kg~kW6j~Vn`Rz)z?LIr=Wb!WIn8jLi>J)#M#x;dZP;|ir`z}d%XFgm5)%i>#C&zBBpJf#0-~^n-E*ItCw2xGznW{O150PXENJSfNxZ+i$@VJMeHJizy zku5_i%*aK#+enQtLgylAXR+V8^8%caz?lx2Pmmg9R_Oa0er3&M`;mfwkXvas8JnAp z)CiMZMk?N9QLpnZ%WZKrQg8!mxXy8;CLo1Dfz8M^2a41mNXcPj&2{wP1X4I|qm{}z z=J^h(Pmmg9cE0>PKKU>=4k?`ekopuUJe{LGr}=ogHHT(LD%ND{k&@SN$#tY+k;0QY z#&HZOIo?;_-~vE<)`T|<*SGC9v4Hn2x3~RmRTt7vOwC0K&*DgZg_N1Amwd~ybDh9W zAM}<{xYTY-2lO`!ZbJ%@^tQkL94Q7R78Z8@uEvXd8v-g5mb^2ZNcOWBM#wU|eg~`_ z%FDw>!?$I5Z4vJaFc7@x#|os-j}(9F<+qKT<#ye3k^DVD+`tg}Jz%j7dB<4@tA%Ot z3I8Ch_OS36jgFUIY!t4*!`5QMb){XOvRL-Dgb_B(*Scx3kpp-ckd0wKLDT(&+(2+bK!lDO#v`&zrcV}z`++wuSrj)4I#NOUo; zv9Q0d?z2?Wf@C}Bb{s4}SQye|e9G~{;->u&79R2tVFB+lh2ylo5GkJ4Fo&46?_tT> z@RD9(nY<3h8R2V7hvjc>sM{1r9c(||%Z;4%cH5iF(Gc(K`Z=c1B%X3`Tk>1s=q$I- z>9C^AdA{@_)p;eC59Z!_Z>15k!EQUe3cWBwH~8y2-;>@%#3cH;z~E%VVf}rr^;a7q z8|`}3YIzz*U$Aj~2&#+5P>t?%c*?PK-weBLN`m)?t_sw?%1U`MSPRZw4 z)3yz;5B+6x+F)*&BmJ!%HW-B;*!5WeoO(>}Fkjm~Som}jy|QfNju*Pg-!=v*u9BX&DKr(xYMkV@t?tZjFg@i1=(_groc_mGmikk3wY$J-F#Y$l5EnIICeW~sWn z%)1_Ts5GS1YRva@fx)7ob-RA8F0h+Yi z2>IBqp9b(ZeZ^BwxsRo%@f3pRju2RW@+x@XnF%Wx7S;kbs4rl(fhC^=D|{k12l>fa zn6l*N_$Dm2B1?V&i}kRm(Wc9%vL4!m)ddzK(VS=fYgqqvUh>={OFHrBs}F@Gug;aY z5SE`&G$_CY3GSNaqp+^;l^4dg_uS6~2D8k?rO$xX&a@W7W1qn4Xl^0TkYY5KFhALB zyH8#d+aWf&m9XSGftU4@FD&}a`7^mQ$fY|7R!4JlT7ner@tE%0NClZG|NWZg%alG3 zscyKMJb|Brr99K$*QOsZ!{ar7Yv%(-&H=kEMFPy+-UEhfLXZpW{-|v3+}0@vjhusa zz3d^`fAjfR@1ZO?nuW?TE9gZpN}l)toc{@ka@D!@51T~3-?A$OY6cHA%ttEz~U;wAn~E? zdRUxh`8oL|SZu}3IPt!(_0?nM=j0K`WOdw3F{?{qaYm%aZo%Tn5pxIqT)vbo%bREf zEV>9cQB2k{SoqLoSpW+W<0%Sv;aWwGm_?LXhZh-z$L#vsfb( ztB+|RR;~8q=H~|!j~j(w+x1h&<*+aTnCp@!WJz=8ZG&J9oCmGS0 zBI}@&M#u@f{y9Jx8kbK!6;GLQ7;?(7+IUyk0IQd|Ge1xqs~`R9^UaIN#|>`*EUZFI z{`W|+_b7G2&*ilI>cW|y1n9$I^)-ir*s>lwZMc48*GqrYZV64sZ`pJB;$kLcAs&q!aI>(4eGRy%Xmu0=|IhIR`nPL{c^S^J!&=k)Beaw8}yPL#lL z4;DU_#-ozUIXQcB+q1)Bw8<@TA}mf1<`VI|vv{8EHZ1ePy4QDbfm!DSwxw~f%u}!a zB~t9RY^%igvXuM~tl#%W$T_?1EkN^0M!$d*`z-g{dOyggA-TuA28#{h01E%_g%vI> zbgIsI`85e5XsE9~|3^nF>~Pf!GLp>>*urU<^SKx)`r17B>4#M*X*pkXoFv#ne^_(? z))_*3o3c!I*nWqF&v#e*>kTi-88L&&mJSPd^ws{>k1iR7=k5BB0CqH@nV;KM|49}` zrx5bvU^PLWZa&mE|CzzWS;<6-7nU3UK3F|rNq3aGEc4)wfxfmLuyB$@kiY3j>8Ft5 z8kGA`*(=h0*b3M9>fK?3rOzf1}r)h9l+{10gEn_oqG{ty-igk1}cdk%{(k(1EjrnKZ$1uT}7)>T+sM5cqRHE$V( zSMB=nTN0Z4qP`fGTHqL7AuM)UKBf5Gmh)vk&)AY-wKsD6``f-jYM>b%4S$oJb}>KX ziBXn$Iei^0E*5kJo5e+CVSZ2gx!iHw893H~us9ww?rpnZVYkCKmbSYxybwJ2L_heh zk@KtFmIa8fo$%yRh*S%6!+VNU8?%8E=Y6d$?io2Z?fR&DvTL}-;O?>Vp5b~6pEv>1 zAz0kFaPQw8@rY+4eJ(746-!e0ClAz{t5{x2||# z6yCwtMh|h+Hm}TJOo7E7pD6tDRYe`_{WJ zEIQx{EZH2NMCw09Ni+6GB1J9(Cl6K^SXg7Y#s3J4lPjbBm1pv=24eGG>8pps;cU2F7OAEv?`qyin&KBO{b9iwk+`S9!bh1XwG%11FQfPRpRnj8%o8WX zNnYQKAU#o8(t#Ubsd|`#>#(qA4-as0wwRl-oWm)w82tF+2D5eu7Q1Y2&3Z}v#wX8s z<~>Fq0?QW`oPwLkLRevDN%J^X!lJfXT7zH>LLLqxX!8S=2Mg}I59`0$3@jB zBv}1XPj>&9%9Cen8-7QV6N)bnv6<(=>HzB%p7Q2ITpMA3Vwf-oj2ECZnlKw`3VQB4P(WlrC&iFaQ zz{lk{hiylyGq6>->#_=)Lm@c68-DAwjc{|a1h^o@@UWQ2AzG}1hT+eWZqgIz0;aVC zEIG-%FHKT;*s77Y1y+#RIzG$R@4#X>%C2|BZ>sizC7%-Cg2g;|5Zl!aSi_`+R=VI< zN#&9V`v|9CSnQeH5br1pZQ`cdxLmO?(&J#6A#UCV@|9(}T)zx!AX<@kq;~F(x#f8| z6_)G^HZXlFERIi>yawyVaywHi#LZ&2&BpJb;;w~G?Lvxyjg^g$ zib_=$u4OQw&iGx|z7DE?0!y`s>3N_mb79z8dYHq*jWQ7_4%>9NZ38TPK!gCiiWIkL z^K_$EsZ!ht5wJKu>5@gTI6l*H`YBj)&2TrVh~KKEyRZO<`a1QfYBA;o2I>nz=`1sh zY~Rx|ujz%~#T_V1g!;c0U^Sw;z`9U#WQi!T9V7nG7%R2Blq65u;@v7$Nw3Y4B``r z8}Hh3lQo}DZIfWhM~)px@v7Khu{GR=CGR-3UX}BQma#ng!cudDSy=$9HR_ZyW9>LB z&ZZdwx_cezL9?E%2P`?dxlExHVj912b+(Sksfvix>sri@`>++G-JY=6W4XP*1xtF< z9rN@pEV6u z+Igh7eYu)P?&|nuV{Ys6X)gj6Z$|JaPE_k*aSY~F^((NrwOK@%r^V0WC30$DM44W) z2PlIP?SsWTD13w8$b0N1LTaK+H*Yyk^lJug9k93-@vS~QeG?XIAPT1X>J1vo>mzco z*H3`O`v698*Vop$5$XxIR}o)G(QhW#e}pysh1Cte(oB!Y7P4VUzo7;F$A7UheTubW zJ?SHIUd5i_)&!#zxwR|-mL|fr4tl=?BoHmi2>ccnpJ{Y+HF-9bw?VATa9`VSSopve z=jFpl$*=bRM9SQ;tj(H2 zuV<+#rq;8#WU?$gV3tL1%-27u6*)Nfn%4@I#k7A?w$}@9YHz$*4~Gj=`$0?KJs58% zyod3hlwkol-RxWp)P{FF-fSQNZ@#FkFo6bM#g#l2Z?-cLZ`PZHH($lI9PBxGm%{rk zyjjjL|5A&Yzz?O&cpL9ZcyGj;um5YBDck=)dI5&R2YAyXAF1}K9M~3RQ<}t% zByLXTi^?Q!HseHcC_}BYvV)n4*9&z9 za1zTJSt@6;T&T*YGNAiFiNf%M9qvct-zc;Ct9&Z!4}vlh;uWW|okXP*6o+P-7fM#3 zxDut{2Q^jYQ<+S|4|Y5Q%7&*9{tuN!r>gQ(9Wy~dHce&xlk!3gTo%c~585-8JqyZ_ zzpm^#P`;>4W-I%@DH~)%IjZ11RglW$d}aTW^8U3@m3s@ycHUOyiz_{q2hI*IRpsAR z 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 Yj`WB0ta1FhoBCyqYa!*k-EGeQ1CmG#vH$=8 delta 73320 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 diff --git a/cli.ts b/cli.ts index 3a5cd9b5..dbe29f0f 100644 --- a/cli.ts +++ b/cli.ts @@ -73,6 +73,19 @@ ${chalk.bold("Commands:")} ${chalk.bold("Example:")} ${chalk.bgGray( `bun cli user search admin` )} + ${alignDots( + chalk.blue("connect-openid") + )} Connect an OpenID account to a local account + ${alignDotsSmall( + chalk.green("username") + )} Username of the local account + ${alignDotsSmall(chalk.green("issuerId"))} ID of the OpenID issuer + ${alignDotsSmall( + chalk.green("serverId") + )} ID of the user on the OpenID server + ${chalk.bold("Example:")} ${chalk.bgGray( + `bun cli user connect-openid admin google 123456789` + )} ${alignDots(chalk.blue("note"), 24)} Manage notes ${alignDots(chalk.blue("delete"))} Delete a note ${alignDotsSmall(chalk.green("id"))} ID of the note @@ -403,6 +416,62 @@ switch (command) { break; } + case "connect-openid": { + const username = args[4]; + const issuerId = args[5]; + const serverId = args[6]; + + if (!username || !issuerId || !serverId) { + console.log( + `${chalk.red(`✗`)} Missing username, issuer or ID` + ); + process.exit(1); + } + + const user = await client.user.findFirst({ + where: { + username: username, + }, + }); + + if (!user) { + console.log(`${chalk.red(`✗`)} User not found`); + process.exit(1); + } + + const issuer = config.oidc.providers.find( + p => p.id === issuerId + ); + + if (!issuer) { + console.log(`${chalk.red(`✗`)} Issuer not found`); + process.exit(1); + } + + await client.user.update({ + where: { + id: user.id, + }, + data: { + linkedOpenIdAccounts: { + create: { + issuerId: issuerId, + serverId: serverId, + }, + }, + }, + }); + + console.log( + `${chalk.green( + `✓` + )} Connected OpenID account to user ${chalk.blue( + user.username + )}` + ); + + break; + } default: console.log(`Unknown command ${chalk.blue(command)}`); break; diff --git a/config/config.example.toml b/config/config.example.toml index 8af0ecd9..0d4ae856 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -24,6 +24,18 @@ port = 40007 api_key = "" enabled = true +# Delete this section if you don't want to use custom OAuth providers +# This is an example configuration +# The provider MUST support OpenID Connect with .well-known discovery +# Most notably, GitHub does not support this +[[oidc.providers]] +name = "CPlusPatch ID" +id = "cpluspatch-id" +url = "https://id.cpluspatch.com/application/o/lysand-testing/" +client_id = "XXXXXXXXXXXXXXXX" +client_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +icon = "https://cpluspatch.com/images/icons/logo.svg" + [http] base_url = "https://lysand.social" bind = "http://localhost" diff --git a/package.json b/package.json index 62ddf26c..a16ddb2d 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "migrate-dev": "bun prisma migrate dev", "migrate": "bun prisma migrate deploy", "lint": "eslint --config .eslintrc.cjs --ext .ts .", - "prisma": "bun run prisma.ts", + "prisma": "DATABASE_URL=$(bun run prisma.ts) bunx prisma", "generate": "bun prisma generate", "benchmark:timeline": "bun run benchmarks/timelines.ts", "cloc": "cloc . --exclude-dir node_modules", @@ -94,11 +94,13 @@ "linkifyjs": "^4.1.3", "marked": "^9.1.2", "meilisearch": "^0.36.0", + "oauth4webapi": "^2.4.0", "prisma": "^5.6.0", "prisma-redis-middleware": "^4.8.0", "semver": "^7.5.4", "sharp": "^0.33.0-rc.2", "vite": "^5.0.4", + "vite-ssr": "^0.17.1", "vue": "^3.3.9", "vue-router": "^4.2.5", "vue-tsc": "^1.8.24" diff --git a/pages/App.vue b/pages/App.vue index 1e5d5a5f..6f8f7da5 100644 --- a/pages/App.vue +++ b/pages/App.vue @@ -1,6 +1,6 @@