From f92d918a1e28e29b794ad4754661ea760c18af46 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 28 Oct 2024 10:26:14 +0800 Subject: [PATCH 1/5] =?UTF-8?q?perf:=20=E9=87=8D=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=AF=86=E7=A0=81=E5=90=8C=E6=97=B6=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E7=AE=A1=E7=90=86=E5=91=98=E8=B4=A6=E6=88=B7=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B9=8B=E5=89=8D=E7=A6=81=E7=94=A8=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81=E8=BF=98=E6=98=AF?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=B8=8D=E8=BF=9B=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/run/docker-compose.yaml | 16 +++++------- .../public/static/images/logo/logo.png | Bin 0 -> 13053 bytes .../src/middleware/reset-passwd/middleware.ts | 1 + .../sys/authority/service/user-service.ts | 24 +++++++++++++++--- 4 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 packages/ui/certd-client/public/static/images/logo/logo.png diff --git a/docker/run/docker-compose.yaml b/docker/run/docker-compose.yaml index cf5bd70f..420cf0b1 100644 --- a/docker/run/docker-compose.yaml +++ b/docker/run/docker-compose.yaml @@ -28,18 +28,14 @@ services: # 设置环境变量即可自定义certd配置 # 配置项见: packages/ui/certd-server/src/config/config.default.ts # 配置规则: certd_ + 配置项, 点号用_代替 - - # ↓↓↓↓ ------------------------------------ 这里可以设置http代理 - #- HTTPS_PROXY=http://xxxxxx:xx - #- HTTP_PROXY=http://xxxxxx:xx # ↓↓↓↓ ----------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false - certd_system_resetAdminPasswd=false - # ↓↓↓↓ -------------------------- 如果设置为true,启动后所有配置了cron的流水线任务都将被立即触发一次 - - certd_cron_immediateTriggerOnce=false - # ↓↓↓↓ -------------------------------- 配置证书和key,则表示https方式启动,使用https协议访问,https://your.domain:7001 - #- certd_koa_key=./data/ssl/cert.key - #- certd_koa_cert=./data/ssl/cert.crt - + # ↓↓↓↓ -------------------------------- 默认同时启动https,https访问地址https://your.domain:7002 + #- certd_https_key=./data/ssl/cert.key + #- certd_https_cert=./data/ssl/cert.crt + #- certd_https_enabled=true + #- certd_https_port=7002 + - # ↓↓↓↓ ------------------------------- 使用postgresql数据库 # - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 # - certd_typeorm_dataSource_default_type=postgres # 数据库类型 diff --git a/packages/ui/certd-client/public/static/images/logo/logo.png b/packages/ui/certd-client/public/static/images/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb42f7473ab13b9981a8db9b9438ede40d03445e GIT binary patch literal 13053 zcmeHtX;f3$()IzG%e|m*`xR#f?N%_#B!~!@M4DC^G9WmBHbYcEz<@#&2?l7r!fl~N zna4zwBmycblLixLY4r*+bPkFn1RNUSfPgIrXoG=o#{o|0@8`SL`{%lr%Vo|vwX2@0 zUAyY3{gVe}`+V(X+7JZIcXj#R6M{7Qm4E;KH}DJja{KS#AGIjY?cYJyTMQ8JpRaqy+u*o3KNNzxLsCR=Yn+JG9I><9`;cHYu{U{@T^~H$vab_agGSsDU5)_KM0| zCu8e+!bha9j*m^g4|eDqke}pq^o_n>2Q>KapZ_B8zk`5DF9iporHYzx1w+QT#u%z( z2`l5fMSl1~PK*0U|KR=U_tWlbIeCu!Iyc&l4@Z>CYI?V+Eje3#GUArE9cA&fVC;Ix zzUylJ$(n`X;0Xj>gmfIB%ePht_Xy~M%JL2uwdd7l{fvfFx}QJJ317!|KYf^rc7nI|=h#{akX+cnex>-MD7Jd!AkUZuTQX6dm zt-Wy(o)4CTApHO*ttG^vhR#B2&PV$^e^WId-9+Fx>fp;5{sA&j3 z)V^_1qa7C65zSb;CBy6e?KL6r-LErtZi^72OA#j|2nXF@sMt`!XRQ&$%HLGtGg;x< zkeMS;6bOT$EozGx3Aq(P@`C$<9oi77a26LGhkCSg1ItOmZWOK1gm@g4NAINeiiZqN zdlCn-idAZ_cj2>X&(BqjWTuj(`$b{eP|7)#uf#){qO~#$O=v&`$3Ka+eERyH_2Bng zSbQIJHo(<6BWdbT1I>xQd=UdIv8Mi%Zc2Kg*p8=1QA>EC@;F*I@aT33*7}^q##rj91H|a)&;d$ziq5`{e;-NA$2YrEqtm0H&Uzw9FT1BS@ zM@$<)OZ>4IZwZ{B_T-1Bt3w-9eqLS1E2nbuVD+`Cuj09~St_Uoa~4p@0}4Y)IIIP~>8?7wG~|N>wD~-f)!++xD#1 zgmS`FL@}6d@)iaSEa9c{K?yJqkKY8|H&=Q8-7_ovdKrkf9JVRHUaQjYlhN5#Y@FHY{+?J+F&LsGKZy2)&0D zFR%Pg{u^UjAG&CVRlY5IA)GG8dqN3*DpHJhyAtyW8#JMQmCZ9xI)E$|PjVsXm5TJl zkRcRh)B@$Zup7JKMrCYEUBTWK8X8yQ9pO?=%^n|X#z9^c!A!FD>A)}P$ZFmYzHf*f zMGZ^pjo!uVG(^u#h2Wi)Oj;b{xjpU{kOcPEi-`dI-JGv?tR5pg;S<<_xJf;6FC~tyqp=)=rb!tDx*-J*U*d{MZOM+ z-RlTJhBN6nCocxs0~dPb==!_qku6DTQ2+UvZ`Xg4vrIcfD|fE?A&`u$(%bF>CmabOhv z5xI^i;Mn4+eOhgHvq#%*%|D}3U5VNE=&}r>ERlI&(A7-BTA4ZPdjUi?3H8~H(s=G0inPsqx-zIy`GEIvpa49ZA>5H zod)mTUh-LLN?8n217GucAT5Kx^~`Gi8&U!DdHGz(Djl2YmhLHc@z1qphm-Uu#GJ^< zjTHX^0-jC{(Msq%h&d=*Zg;L#P$a`!gYSOWD6_=l10M}v5Us+m80(HyEoFkcPU2YJ zjVJCn$nbc(-d1|HXoJjdtjGdds7!Xo)gTy@b=Ir>9MlWAT`(Pp z+zvHp2^4#HSMDSt|p;vbe3qeH=n23%d7T4o3zfDJvN{-3a53mph_DxVio zM>5Xv%Q%;BEAHU8QdmoLwzMkO)uRJDz%DQBev`pYm)msL^c3rn>(bBVkLQ20olkd# z5{?GUE-P?}5Ty||aj6}=R2OLkDJ6M)_o-K64NqvvcI?rBzN8`9o^nQ%Ae!msU{Osb z=7wKTuiu1?F#h6TZf!A&oJXHAelREy+4_QV2k11jN0$m@uqAk*8PS2eujPqMS^Kr2 z536Uxc@ZOVxQp>HLv(U2>m<`%QZ^)}7U%P!dNKAqve_BS<&cr4_aU)sr;mk{>w*)v zg{qd|h=sGIt&&*L#~ot(%8wiqI5S-(WzO(;2D2w!E#Mu-L19bs9&$Mpq~RKJKWy#&inLzI$ zqgW_Fjy(Zw^i6q_+<8(!wk(;2PRdx#{!#QXSuHoqvi$EN@ABrqRgkDgu8wCSa*y#4 z)kE5vsZ@940(Ge3A$GY^U8;Y+HOY?aSlq{V?jUr1I4Fn!%Mq|%DGf1R=9?9sVNEKh zN+Z5UU&@eQ00a(L2zFL%m%q=T2{zG3G)8($hPLyz7en>^Dk?QULb`Dckzw*SG=ODN9v$@@a3(`nlsbR7@sH2ezg&$BdM5UkGDgt> z#+8laxL4Ydc)?vGO~R|?M))(3hYcTbvH{?AF?5UUTWKZ4cSX048R9h~Wv_#z59 z02fJC;Vpgfnowc`7Umr>-^p)g&<;^U>Vla&95$>g4(2&>q58L~l7>P$hmg*B4M}1R zxQOY_JfscHQ&G5r{-hEwWZln@guB&{EM1dcuSBwe>;J^so=c}vhy~X3M#$49hI!-d z93&%eCGaW&5Ol#U^<0pdk5JD5AQAyh@@&RcsW>~4Z3xB8X1uh==N1D!-p>8tb| zIt~@RI3&q4wANO*oq5z@gDF3jKc@l7H8(A$l1hdukXPcOP8&R^)#ZU$gh^q>>Q(%j z@=QmL|t)@vF0fy zKJ9wJy<3Ok!zm;xMH(?x8QZM3OovGZ8|K9&WfX%(*T##Tp*s}v{8eZfdWo^dFI}|Z z%<7QVorm1tPl|2C`@9ky_dAt8Qql3^p8P)Or&VT43M1D&42tTRV z-&HLrSyO0&g^9N>miev-XNzB{_4r48i!Xa76y2O7a;LdVe7@Xf7d(zciwBgE68Nk;4{#Ps)_w}A z&$?bMBt20cM4@-Sk*&CPokbOF5bkTVVy$9@4&eKgy`ieVOWB1YQ*Ksu0AcmD>q5RF zC4=T*!}3-~yTq1!xCrEYY)zJs|e%m`*7)r})Y>@GD#sdRr+t#U=W!7(2ehlXD+avc1V)x3T#L?V&4SH}aw}TG}RpHlkXbMX= z2$eHiJT`AmqS>zs-fv&S)__PCbUsll;03Trq%ro+e>^uxe35R?2Nqb(|KU^PW6|d0 zx4h2-*0g^j`!@I`Qa1FDtL?|=Ejp19Xv{1=b&ZSr%`7J_cA)tM(~Tv=Q}**3j@lEO z)S!T6ceZ?N?0&ddakuNVAAH8%ndW4iIL;ou90k5t!+a0ybB4db>S>8n&s{`kx1 zmd&Cq_v%=b$s&)z7(B7DBz&;or`|56Uq^71NmkULJybt0>c@|4A#mlbr@)o&QKeFo zBuO_%1FAPWGW*Pgy?5XdcdRRI)ZhL|Rcu=cve=&A3oz1|!6^4?Rn(QIHa_f^esHG!lWWz_in45?uD8y4JnU4ClokvOr#X}Tm6(4utCbmW%7zS0mck&^ z!4$0dHO8vltwmWyX8nV`9&n631f_fi8>pOaOHA6Ec`g*IR1Y7iyv)# zMkB8TuF;V%vu}TQ8hB~jmstO7WL;}X%PBuNP$~2LOo*lT8lidDTT8;7bgO;<(O3U> zjDboE5(@@)Hx^~B17Wdb<>F72sSd-W3G9&h;M;`&-n==hfjHlg5!=@H+M{U%M5D@Q zUR`0!8cz{SllF!`2AKS729qMa1@YNQZztYA1=0f6&jcXpsmJg!BRl69!4%oP{nmHD zec!5jXjvmXrg&cxk~v2W0Rf;DsV5(ax)L}x=UJrQQL^(LEg1mB;r|1O@-tho8g0&M zceI4OGxkq>3!TlED>vhJpVUln))>Qzx#B{JReYysF63{M#LO zWFsW}#3R)Zy6WHS(d4lR<$yR*D4nA=>zuHcNDKSz53Oy(PIb7Xy+(lYP>B?!UoF6v z>HYA|Ahgpq_&z`8CBttFLi4jnQ$c(@ zhCYKk0rI6^mdJsdH3W|o@4A*YWm0%z|E6OKf^4nARU4|`@R>SNre^>%eGN5g+V|W< zkzRwFeFQf1c8xrGxA%5Gsmt!eV`AJ^+dXCu3r5NaW2yd6q9?WnzZA-Ar~X)1TD!d^ z9z2PdfBVF50Fbkv?d0FCxVzCM9-PSUk>er9QeCLjrHSJPXX)bcjA#hTI{k&Ds<N?1L^ z!0|$9OtKp}l}yauT@x>VltGK#Bd-B_#eIhPB4sy;Yq{;#m6}m;%&mfLjW>kWcxz4Q z`Nl6aU?K9dL|RqVbL817!?V>Nh^AaUx>H0ls0ET|rdBZ5oL25q5&}xxO2H)GpNcdc z4T;@&YNA*JI?()uAwNU6AjZv~kZE+@kE0HyESv#Sa5c}bumwQ5 z4>^Z;+}+ID<;D@^5>^TUGrdG-CJitqj|+U=$oV{HpEY)r_yYNnn-O)coLn{tX-2c& zosay;73oG^FyhQ&QHy3QMMj57TI zw~%r03)lQO1CUAqJER1J4;P*Ip2^g9kBpMAd zP(iT6h8~w_H=556x$F#f0sBIAY^NF&bmsHRq1JGVdkwV&$zr@h`H08njS7;s*HOB> z3N1tILncMX$zVoeJ`*#!;}Z03hQtrBZ=i({UX>+_4rtqyD0q+VgEp-k~7MCB+6vhF=s{`}3D`JGjm_oh4Ze%X zdCg?0X>_a zA(NhowCPI4-+pZ~$T0%(sK64n!PQqYr#926(fsNtxDYOK_?G4Imo9qzKDq zMcNLh$C-{TH-OsoRMwH&z!Us=4Kau=at&#_i^H1%{y>El>a5--PiCCSpgprx>~z?m zBOZmDK}&yownX=CTbk)5#seDS9@>qVBW+!#3Z?@Q2vXsDcGz3t34z{#Nnd4H+Q)qe zIGQ;egbuvUYXZ`1qQd5I58wINehJ%C51NOWHtINBe%j3!QbD!;4QrRf&N6NvH=hS> zVPW~8l)bTf%vei@hDcvP&(>`=ECu9=qJPvAx@dtlejA;_^byb+Z&Xec)l6L0la0bP zTxg3gR@Tnn*y>a7GH7>fSzAB|7zxtFEHCJy5mrv=?R`wwfriU8xu1Z=JOH#Ro@Ni{ zd?uKZSAf_6gH?*HKgl=~@K`R=3eCjpEbI6n!B#NDWn;VMCvURZIe-%@mU5?ab!87i zV%-$-zw%w*F=GUjMyo3B9ig#MXvylYCfDU%2g9}s71x#ex67v84>JuTqbK*yIDXw8$R%woO z@P(T;v7!M{w^;=QsRMn&Y|=)WRKrc;3GLV5EegTB7RxZ&rWI|nWic9W$nvV=IYaoD z!p?PI!s!V{<0`?Q`0@o($31BzE6Q;MXP`1M?B4>g(`pFSQwh%PAU(N{~TQ{ffbs)!AJTqzetdSDs6 z9PS1kQO^Ye00NjeLu@1W{g7ZU`M4!=+u{+Jk>Eyj{z9O?{zwE&_MtZzU57K{%w!ui z6OQi3@L-e(qqI2tz|97^B5OmtD0p#kxr;1cw|E!%lHdjVBzxm6-}1ddKPKjk1g~023Ur zQH52#zMEo6k_xL*YLdlxvAb7Rvm2lyHQ?<$_Is$FgoQV_Yba|fOnbp~(ga01IqE|g zCnhl;s(~9M)Y>DWU3o)Pp2knB?PKm<%qu(Bp?Sj~|Op4E&=3&}jQ`4b|TX z!Ue|#y9G=^s320XUotfj<<&zCIN_I8UDwl&nJV!oZX7;G@z1$;>-KuQHOralrCooc z@=Uej^*mdwYZ`9lX0!9V9nU=4M5K?9qaz&ZZ+NS6R7sCI9q3JcZaC6|W<&~xw;f!l z{h%r@YM9m9!y6&d)>@GDTmjSMF_(JG$y*>cD@MG zkRu0}hvki^9S*9P%cYW1Yx&>+E8|)fUU&1)G|C3$sa3@sO0NNxtW%H%MwZwh@6ak_ z5DH)B{IPiggDKB(7AFRA2N<(5oGu?os1B97OH_%;h^*b zbLIsB<^ z#b6wg4KD;Y5gd_8arF)VboG?EB%IZ(axc;NUp*ow7!mZp|u9a?F0lO+AjwrO%1Xp;l^K`mIMYdzb;8}zN;X#LbKY#Q zs-zA`CohlWs>6Kq5&Dkl7|EjC`?0$uSra{6yW$SM`=p$wzvNs6{KP9%C3nz#EES=G z7*H2q$LzQ^T8{E`l$j$?{cS8QpF|6rDCV%40!PRy9Q#3$-Vh$)b0^4Z5EDDI(q;L8 zyD`Jy$`{&*%>(kvNO>;$H4fSmp&}+?6s8uZDy66-u2-~h`8o7CxX06veVw*h;lx?xYyWbm zYvoQUuPp>c{$qU=jZ6;b$8C_AfcI7Jn349b$2;J`g^?VKSs={% z>kmt86kC*c#%|oj0{7#NLrw3sVCDU)M_B)At=+VS>mIKs7{wN$wTX7!a0d>IVtL`iDUtU6bz_5Z}LU~OlP=tE10v%dp1&sXU!z3=P9=WOgJbBw(HKN~Zbx)6cponU+^AAZh{Jf`qQ*-n(Kj;C(W+jF{L?*3%m>5cd~lNy+@iwVQ;j}+rqX;MiOZJj zLYGw(wu%{w?K2A5*KQ1YUX=m2VSv2LjzyFI$pAediHP-ULM|9-wt@Sk13+(;aXwTL z%wTL~KNHkL9+dXv0CY>$J$VfgJ#=vo;Jg1JA{ z#rV9uZDGPuWq}z72(nL?ZyRcyB;DoRS!0uYQHMsG&8&vI7be8fGpb{sPJr?nTyO~Z z4>p?A9<-i9i;&BU2TgF$ydSX@Ae1cqhMp|HEcS)Z;GmtDgZY$hy^`|lwgHb{$~I{x zbgDjNNLPR-7NF#h<%ShQRtr_|PifqSR3}%NzZn`d2Sa+OD@$e7C(Z75RH@fXJJ;;- zV}p4(h@}$c7o&CHTJ9h(3}81j$W@Gvj}0InD$PH*PfC(rKsL(${6iZk7e8Ky4hU*? zUF`o { } async resetPassword(userId: any, newPasswd: string) { + if (!userId) { + throw new CommonException('userId不能为空'); + } const param = { id: userId, password: newPasswd, @@ -210,15 +213,19 @@ export class UserService extends BaseService { ids = ids.split(','); ids = ids.map(id => parseInt(id)); } - if (ids instanceof Array) { - if (ids.includes(1)) { - throw new CommonException('不能删除管理员'); - } + if (ids.length === 0) { + return; + } + if (ids.includes(1)) { + throw new CommonException('不能删除管理员'); } await super.delete(ids); } async isAdmin(userId: any) { + if (!userId) { + throw new CommonException('userId不能为空'); + } const userRoles = await this.userRoleService.find({ where: { userId, @@ -229,4 +236,13 @@ export class UserService extends BaseService { return true; } } + + async updateStatus(id: number, status: number) { + if (!id) { + throw new CommonException('userId不能为空'); + } + await this.repository.update(id, { + status, + }); + } } From 51b6fed468eaa6f28ce4497ce303ace1a52abb96 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 28 Oct 2024 15:31:45 +0800 Subject: [PATCH 2/5] =?UTF-8?q?perf:=20=E9=BB=98=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E4=B9=A6=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=BA35=E5=A4=A9=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=85=BE?= =?UTF-8?q?=E8=AE=AF=E4=BA=91=E5=88=A0=E9=99=A4=E8=BF=87=E6=9C=9F=E8=AF=81?= =?UTF-8?q?=E4=B9=A6=E6=8F=92=E4=BB=B6=EF=BC=8C=E5=8F=AF=E4=BB=A5=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E8=85=BE=E8=AE=AF=E4=BA=91=E8=BF=87=E6=9C=9F=E8=AF=81?= =?UTF-8?q?=E4=B9=A6=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/src/plugin/api.ts | 6 + .../src/plugin/cert-plugin/base.ts | 4 +- .../src/plugin/cert-plugin/index.ts | 2 +- .../src/plugin/cert-plugin/lego/index.ts | 2 +- .../src/views/certd/pipeline/crud.tsx | 2 +- .../src/plugins/plugin-tencent/lib/index.ts | 17 ++ .../plugin/delete-expiring-cert/index.ts | 201 ++++++++++++++++++ .../plugins/plugin-tencent/plugin/index.ts | 1 + 8 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 5fd30609..2b86b0e5 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -111,6 +111,12 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { return this._result.files; } + checkSignal() { + if (this.ctx.signal && this.ctx.signal.aborted) { + throw new Error("用户取消"); + } + } + setCtx(ctx: TaskInstanceContext) { this.ctx = ctx; this.logger = ctx.logger; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts index ec3b7cbe..8efcdf09 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -61,7 +61,7 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { @TaskInput({ title: "更新天数", - value: 20, + value: 35, component: { name: "a-input-number", vModel: "value", @@ -212,7 +212,7 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { this.logger.info("input hash 有变更,检查是否需要重新申请证书"); //判断域名有没有变更 /** - * "renewDays": 20, + * "renewDays": 35, * "certApplyPlugin": "CertApply", * "sslProvider": "letsencrypt", * "privateKeyType": "rsa_2048_pkcs1", diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 2c842da4..435a1a6a 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -33,7 +33,7 @@ export type DomainsVerifyPlanInput = { desc: "免费通配符域名证书申请,支持多个域名打到同一个证书上", default: { input: { - renewDays: 20, + renewDays: 35, forceUpdate: false, }, strategy: { diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts index 881a7ac7..a2c13c71 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts @@ -17,7 +17,7 @@ export type { CertInfo }; desc: "支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上", default: { input: { - renewDays: 20, + renewDays: 35, forceUpdate: false, }, strategy: { diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index 7b83032d..c1632098 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -124,7 +124,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp { title: "申请证书", input: { - renewDays: 20, + renewDays: 35, ...form }, strategy: { diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts index 8777c920..8022ed91 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/lib/index.ts @@ -55,4 +55,21 @@ export class TencentSslClient { this.checkRet(res); return res; } + + async DescribeCertificates(params: any) { + const client = await this.getSslClient(); + const res = await client.DescribeCertificates(params); + this.checkRet(res); + return res; + } + + async doRequest(action: string, params: any) { + const client = await this.getSslClient(); + if (!client[action]) { + throw new Error(`action ${action} not found`); + } + const res = await client[action](params); + this.checkRet(res); + return res; + } } diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts new file mode 100644 index 00000000..981df38d --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts @@ -0,0 +1,201 @@ +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; +import { AbstractPlusTaskPlugin, TencentAccess } from '@certd/plugin-plus'; +import { TencentSslClient } from '../../lib/index.js'; +import dayjs from 'dayjs'; +import { remove } from 'lodash-es'; + +@IsTaskPlugin({ + name: 'TencentDeleteExpiringCert', + title: '删除腾讯云即将过期证书', + icon: 'svg:icon-tencentcloud', + group: pluginGroups.tencent.key, + desc: '仅删除未使用的证书', + default: { + strategy: { + runStrategy: RunStrategy.AlwaysRun, + }, + }, + needPlus: true, +}) +export class TencentDeleteExpiringCert extends AbstractPlusTaskPlugin { + @TaskInput({ + title: 'Access提供者', + helper: 'access 授权', + component: { + name: 'access-selector', + type: 'tencent', + }, + required: true, + }) + accessId!: string; + + @TaskInput({ + title: '关键字筛选', + helper: '仅匹配ID、备注名称、域名包含关键字的证书,可以不填', + required: false, + component: { + name: 'a-input', + }, + }) + searchKey!: string; + + @TaskInput({ + title: '最大删除数量', + helper: '单次运行最大删除数量', + value: 100, + component: { + name: 'a-input-number', + vModel: 'value', + }, + required: true, + }) + maxCount!: number; + + @TaskInput({ + title: '即将过期天数', + helper: '仅删除有效期小于此天数的证书,\n要避免腾讯云的证书过期邮件提醒,此处需要设置为30,同时申请证书任务的更新天数要设置为35', + value: 10, + component: { + name: 'a-input-number', + vModel: 'value', + }, + required: true, + }) + expiringDays!: number; + + @TaskInput({ + title: '检查超时时间', + helper: '检查删除任务结果超时时间,单位分钟', + value: 10, + component: { + name: 'a-input-number', + vModel: 'value', + }, + required: true, + }) + checkTimeout!: number; + + async onInstance() {} + + async execute(): Promise { + const access = await this.accessService.getById(this.accessId); + const sslClient = new TencentSslClient({ + access, + logger: this.logger, + }); + + const params = { + Limit: this.maxCount ?? 100, + SearchKey: this.searchKey, + ExpirationSort: 'ASC', + FilterSource: 'upload', + // FilterExpiring: 1, + }; + const res = await sslClient.DescribeCertificates(params); + let certificates = res?.Certificates; + if (!certificates && !certificates.length) { + this.logger.info('没有找到证书'); + return; + } + + certificates = certificates.filter((item: any) => { + const endTime = item.CertEndTime; + return dayjs(endTime).add(this.expiringDays, 'day').isBefore(dayjs()); + }); + for (const certificate of certificates) { + this.logger.info(`证书ID:${certificate.CertificateId}, 过期时间:${certificate.CertEndTime},Alias:${certificate.Alias},证书域名:${certificate.Domain}`); + } + this.logger.info(`即将过期的证书数量:${certificates.length}`); + if (certificates.length === 0) { + this.logger.info('没有即将过期的证书, 无需删除'); + return; + } + const certIds = certificates.map((cert: any) => cert.CertificateId); + + const deleteRes = await sslClient.doRequest('DeleteCertificates', { + CertificateIds: certIds, + IsSync: true, + }); + this.logger.info('删除任务已提交: ', JSON.stringify(deleteRes)); + const ids = deleteRes?.CertTaskIds; + if (!ids && !ids.length) { + this.logger.error('没有找到任务ID'); + return; + } + const taskIds = ids.map((id: any) => id.TaskId); + const startTime = Date.now(); + const results = {}; + + const statusCount = { + success: 0, + failed: 0, + unauthorized: 0, + unbind: 0, + timeout: 0, + }; + const total = taskIds.length; + + while (Date.now() < startTime + this.checkTimeout * 60 * 1000) { + this.checkSignal(); + const taskResultRes = await sslClient.doRequest('DescribeDeleteCertificatesTaskResult', { + TaskIds: taskIds, + }); + const result = taskResultRes.DeleteTaskResult; + if (!result || result.length === 0) { + this.logger.info('暂未获取到有效的任务结果'); + continue; + } + for (const item of result) { + //遍历结果 + const status = item.Status; + if (status !== 0) { + remove(taskIds, id => id === item.TaskId); + } + // Status : 0表示任务进行中、 1表示任务成功、 2表示任务失败、3表示未授权服务角色导致任务失败、4表示有未解绑的云资源导致任务失败、5表示查询关联云资源超时导致任务失败 + if (status === 0) { + this.logger.info(`任务${item.TaskId}<${item.CertId}>: 进行中`); + } else if (status === 1) { + this.logger.info(`任务${item.TaskId}<${item.CertId}>: 成功`); + results[item.TaskId] = '成功'; + statusCount.success++; + } else if (status === 2) { + this.logger.error(`任务${item.TaskId}<${item.CertId}>: 失败`); + results[item.TaskId] = '失败'; + statusCount.failed++; + } else if (status === 3) { + this.logger.error(`任务${item.TaskId}<${item.CertId}>: 未授权服务角色导致任务失败`); + results[item.TaskId] = '未授权服务角色导致任务失败'; + statusCount.unauthorized++; + } else if (status === 4) { + this.logger.error(`任务${item.TaskId}<${item.CertId}>: 有未解绑的云资源导致任务失败`); + results[item.TaskId] = '有未解绑的云资源导致任务失败'; + statusCount.unbind++; + } else if (status === 5) { + this.logger.error(`任务${item.TaskId}<${item.CertId}>: 查询关联云资源超时导致任务失败`); + results[item.TaskId] = '查询关联云资源超时导致任务失败'; + statusCount.timeout++; + } else { + this.logger.info(`任务${item.TaskId}<${item.CertId}>: 未知状态:${status}`); + statusCount.failed++; + } + } + this.logger.info( + // eslint-disable-next-line max-len + `任务总数:${total}, 进行中:${taskIds.length}, 成功:${statusCount.success}, 未授权服务角色导致失败:${statusCount.unauthorized}, 未解绑关联资源失败:${statusCount.unbind}, 查询关联资源超时:${statusCount.timeout},未知原因失败:${statusCount.failed}` + ); + if (taskIds.length === 0) { + this.logger.info('任务已全部完成'); + + if (statusCount.unauthorized > 0) { + throw new Error('有未授权服务角色导致任务失败,需给Access授权服务角色SSL_QCSLinkedRoleInReplaceLoadCertificate'); + } + + return; + } + await this.ctx.utils.sleep(10000); + } + this.logger.error('检查任务结果超时', JSON.stringify(results)); + } +} + +new TencentDeleteExpiringCert(); diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/index.ts index aadbe339..758b2d3a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/index.ts @@ -5,3 +5,4 @@ export * from './deploy-to-cdn-v2/index.js'; export * from './upload-to-tencent/index.js'; export * from './deploy-to-cos/index.js'; export * from './deploy-to-eo/index.js'; +export * from './delete-expiring-cert/index.js'; From 1c656f8b908de921d5a6053295069d72e6d3afc9 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 28 Oct 2024 16:44:10 +0800 Subject: [PATCH 3/5] chore: --- docs/guide/use/tencent/images/delete.png | Bin 0 -> 69271 bytes docs/guide/use/tencent/images/delete2.png | Bin 0 -> 24146 bytes docs/guide/use/tencent/index.md | 13 +++++++++++++ packages/ui/certd-client/src/style/common.less | 8 ++++++++ .../plugin/delete-expiring-cert/index.ts | 5 +++-- 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 docs/guide/use/tencent/images/delete.png create mode 100644 docs/guide/use/tencent/images/delete2.png diff --git a/docs/guide/use/tencent/images/delete.png b/docs/guide/use/tencent/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..c480c97ab97ae924a100e29c22b08927c5bf07b5 GIT binary patch literal 69271 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 WiT7xXy8$SOX|&Y!)i8G+JpC8qy2;1@ literal 0 HcmV?d00001 diff --git a/docs/guide/use/tencent/index.md b/docs/guide/use/tencent/index.md index 2dcebee6..9dbf6a39 100644 --- a/docs/guide/use/tencent/index.md +++ b/docs/guide/use/tencent/index.md @@ -6,3 +6,16 @@ 打开 https://console.cloud.tencent.com/cam/capi 然后按如下方式获取腾讯云的API密钥 ![](./tencent-access.png) + + +## 如何避免收到腾讯云证书过期邮件 + +腾讯云在证书有效期还剩28天时会发送过期通知邮件 +您可以通过配置“腾讯云过期证书删除”任务来避免收到此类邮件。 + +![](./images/delete.png) + +注意点: +> 1. 选择腾讯云授权,需授权`服务角色SSL_QCSLinkedRoleInReplaceLoadCertificate`权限 +> 2. `1.26.14`版本之前Certd创建的证书流水线默认是到期前20天才更新证书,需要将之前创建的证书申请任务的更新天数修改为35天,保证删除之前就已经替换掉即将过期证书 +![](./images/delete2.png) \ No newline at end of file diff --git a/packages/ui/certd-client/src/style/common.less b/packages/ui/certd-client/src/style/common.less index 7a4fa921..a33cacbd 100644 --- a/packages/ui/certd-client/src/style/common.less +++ b/packages/ui/certd-client/src/style/common.less @@ -178,6 +178,14 @@ h1, h2, h3, h4, h5, h6 { color: #1890ff; } +.color-red { + color: red; +} + +.color-green { + color: green; +} + .iconify{ //font-size: 16px; } diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts index 981df38d..99827493 100644 --- a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts @@ -53,8 +53,9 @@ export class TencentDeleteExpiringCert extends AbstractPlusTaskPlugin { @TaskInput({ title: '即将过期天数', - helper: '仅删除有效期小于此天数的证书,\n要避免腾讯云的证书过期邮件提醒,此处需要设置为30,同时申请证书任务的更新天数要设置为35', - value: 10, + helper: + '仅删除有效期小于此天数的证书,\n注意:`1.26.14`版本之前Certd创建的证书流水线默认是到期前20天才更新证书,需要将之前创建的证书申请任务的更新天数改为35天,保证删除之前就已经替换掉即将过期证书', + value: 30, component: { name: 'a-input-number', vModel: 'value', From 6dabad76baba96be0f8af36a3fbfb9f5182aecf1 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 28 Oct 2024 17:27:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E9=A1=B6=E9=83=A8=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=8F=98...=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/certd-client/src/layout/layout-framework.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ui/certd-client/src/layout/layout-framework.vue b/packages/ui/certd-client/src/layout/layout-framework.vue index d399ca7c..e764310f 100644 --- a/packages/ui/certd-client/src/layout/layout-framework.vue +++ b/packages/ui/certd-client/src/layout/layout-framework.vue @@ -252,8 +252,6 @@ const { token } = useToken(); justify-content: flex-end; align-items: center; display: flex; - } - .header-menu { flex: 1; } } From 5575c839705f6987ad2bdcd33256b0962c6a9c6a Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 28 Oct 2024 18:20:10 +0800 Subject: [PATCH 5/5] =?UTF-8?q?perf:=20=E6=8E=88=E6=9D=83=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E6=94=AF=E6=8C=81=E8=A7=A3=E5=AF=86=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../access/secret-plain-getter.vue | 32 +++++++++++++++++++ .../src/views/certd/access/api.ts | 8 +++++ .../src/views/certd/access/common.tsx | 11 ++++++- .../controller/pipeline/access-controller.ts | 6 ++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 packages/ui/certd-client/src/views/certd/access/access-selector/access/secret-plain-getter.vue diff --git a/packages/ui/certd-client/src/views/certd/access/access-selector/access/secret-plain-getter.vue b/packages/ui/certd-client/src/views/certd/access/access-selector/access/secret-plain-getter.vue new file mode 100644 index 00000000..cf05c662 --- /dev/null +++ b/packages/ui/certd-client/src/views/certd/access/access-selector/access/secret-plain-getter.vue @@ -0,0 +1,32 @@ + + + diff --git a/packages/ui/certd-client/src/views/certd/access/api.ts b/packages/ui/certd-client/src/views/certd/access/api.ts index 903f9c31..ca9d47c6 100644 --- a/packages/ui/certd-client/src/views/certd/access/api.ts +++ b/packages/ui/certd-client/src/views/certd/access/api.ts @@ -43,6 +43,14 @@ export function createAccessApi(from = "user") { }); }, + async GetSecretPlain(id: number, key: string) { + return await request({ + url: apiPrefix + "/getSecretPlain", + method: "post", + data: { id, key } + }); + }, + async GetProviderDefine(type: string) { return await request({ url: apiPrefix + "/define", diff --git a/packages/ui/certd-client/src/views/certd/access/common.tsx b/packages/ui/certd-client/src/views/certd/access/common.tsx index 99258f64..5b2c3ebe 100644 --- a/packages/ui/certd-client/src/views/certd/access/common.tsx +++ b/packages/ui/certd-client/src/views/certd/access/common.tsx @@ -1,9 +1,11 @@ import { ColumnCompositionProps, dict } from "@fast-crud/fast-crud"; -import { computed, ref, toRef } from "vue"; +import { computed, provide, ref, toRef } from "vue"; import { useReference } from "/@/use/use-refrence"; import { forEach, get, merge, set } from "lodash-es"; +import SecretPlainGetter from "/@/views/certd/access/access-selector/access/secret-plain-getter.vue"; export function getCommonColumnDefine(crudExpose: any, typeRef: any, api: any) { + provide("accessApi", api); const AccessTypeDictRef = dict({ url: "/pi/access/accessTypeDict" }); @@ -32,6 +34,13 @@ export function getCommonColumnDefine(crudExpose: any, typeRef: any, api: any) { }; const column = merge({ title: key }, defaultPluginConfig, field); + if (value.encrypt === true) { + column.suffixRender = (scope: { form: any; key: string }) => { + const { form, key } = scope; + const inputKey = scope.key.replace("access.", ""); + return ; + }; + } //eval useReference(column); diff --git a/packages/ui/certd-server/src/controller/pipeline/access-controller.ts b/packages/ui/certd-server/src/controller/pipeline/access-controller.ts index 3ee6e737..4b1df683 100644 --- a/packages/ui/certd-server/src/controller/pipeline/access-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/access-controller.ts @@ -67,6 +67,12 @@ export class AccessController extends CrudController { return this.ok(access); } + @Post('/getSecretPlain', { summary: Constants.per.authOnly }) + async getSecretPlain(@Body(ALL) body: { id: number; key: string }) { + const value = await this.service.getById(body.id, this.getUserId()); + return this.ok(value[body.key]); + } + @Post('/accessTypeDict', { summary: Constants.per.authOnly }) async getAccessTypeDict() { const list = this.service.getDefineList();