From 72dfd1f414d547b11da5e511ab2c2cbe270b95e0 Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:13:30 -0600 Subject: [PATCH] Add Yubico Authenticator as a Windows FMA (#39351) This pull request adds support for managing the Yubico Authenticator application on Windows. The changes introduce the necessary metadata, installation and uninstallation scripts, and update the application catalog to include this new platform-specific entry. **Addition of Yubico Authenticator for Windows:** * Added a new input file with metadata for the Windows version of Yubico Authenticator, specifying details like package identifier, architecture, and default categories in `yubico-authenticator.json`. * Created an output file containing version information, installation and uninstallation scripts, installer URL, SHA256 hash, and upgrade code for Yubico Authenticator on Windows in `yubico-authenticator/windows.json`. * Updated the main application catalog (`apps.json`) to include a Windows-specific entry for Yubico Authenticator, with appropriate slug and description. **Frontend icon update:** * Updated the image data for the Yubico Authenticator icon in the frontend component to reflect the correct or updated icon asset. --- .../inputs/winget/yubico-authenticator.json | 10 ++++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ .../outputs/yubico-authenticator/windows.json | 22 ++++++++++++++++++ .../components/icons/YubicoAuthenticator.tsx | 2 +- ...app-icon-yubico-authenticator-60x60@2x.png | Bin 6063 -> 7317 bytes 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 ee/maintained-apps/inputs/winget/yubico-authenticator.json create mode 100644 ee/maintained-apps/outputs/yubico-authenticator/windows.json diff --git a/ee/maintained-apps/inputs/winget/yubico-authenticator.json b/ee/maintained-apps/inputs/winget/yubico-authenticator.json new file mode 100644 index 0000000000..7a4ab1f6fe --- /dev/null +++ b/ee/maintained-apps/inputs/winget/yubico-authenticator.json @@ -0,0 +1,10 @@ +{ + "name": "Yubico Authenticator", + "slug": "yubico-authenticator/windows", + "package_identifier": "Yubico.Authenticator", + "unique_identifier": "Yubico Authenticator", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 35a61df28b..9e743cf9d8 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -1730,6 +1730,13 @@ "unique_identifier": "com.yubico.yubioath", "description": "Yubico Authenticator is an application for generating TOTP and HOTP codes." }, + { + "name": "Yubico Authenticator", + "slug": "yubico-authenticator/windows", + "platform": "windows", + "unique_identifier": "Yubico Authenticator", + "description": "Yubico Authenticator is an application for generating TOTP and HOTP codes." + }, { "name": "Yubikey Manager", "slug": "yubico-yubikey-manager/darwin", diff --git a/ee/maintained-apps/outputs/yubico-authenticator/windows.json b/ee/maintained-apps/outputs/yubico-authenticator/windows.json new file mode 100644 index 0000000000..cf476d89a1 --- /dev/null +++ b/ee/maintained-apps/outputs/yubico-authenticator/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.3.1", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Yubico Authenticator' AND publisher = 'Yubico AB';" + }, + "installer_url": "https://github.com/Yubico/yubioath-flutter/releases/download/7.3.1/yubico-authenticator-7.3.1-win64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "df5aa7e3", + "sha256": "a278b9b558315f6eee4798034defe3716dd759ea36c1b0d076fbb386357a61e3", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{FCBAFC57-AAAA-47B8-B861-20BDA48CD4F6}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "df5aa7e3": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts(\"{FCBAFC57-AAAA-47B8-B861-20BDA48CD4F6}\")) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n \n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n \n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n \n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/YubicoAuthenticator.tsx b/frontend/pages/SoftwarePage/components/icons/YubicoAuthenticator.tsx index 0a95ebfed4..7b8764859a 100644 --- a/frontend/pages/SoftwarePage/components/icons/YubicoAuthenticator.tsx +++ b/frontend/pages/SoftwarePage/components/icons/YubicoAuthenticator.tsx @@ -7,7 +7,7 @@ const YubicoAuthenticator = (props: SVGProps) => ( ); diff --git a/website/assets/images/app-icon-yubico-authenticator-60x60@2x.png b/website/assets/images/app-icon-yubico-authenticator-60x60@2x.png index 869a2c837e9dceb0223b83207528c880e3d9a110..ec04b38d67dad33db323d8a791398b5d8706221c 100644 GIT binary patch literal 7317 zcmaJ`1yEee(mp_t;2InjXR*bCvux1CgG+E<+}#2R?hb)K0)!yJ9RegFKyddU!GZ^Z z>ks$7_wM~~{qLWuKHbyZ-*op>Pt}}rBA=?r;b2l=0sw#`50_TIvT6=#lS?yujTP zAig90a0Kw+4?O@l-tqeZzoUEnADow)ms^DUu?P<@h+9~M@39EK001E8A^!&zoQLw4 zd=Hm}W#rzmht6<4HvqsQx+f$cE1L`eP;d~My6(ElN+RY?4qT=dPG*)|-VV<9C_v0x ztAiFk|C|KTBWC*P|f^q@an-0j5ab(Nojq?}wWK>}RdT-@|fOb`ep z=4xRjqAo4_FZkU|oZiOW-B|;S0qQbf0cDtAmrWx z;o;(j{9iCjZ^VCr-CO=E>~4?#Q`Y|q=56ZyC+LsO_%lbb`wT?%)Gghd>^<&lfeP}9 z{gKxHQvOxcpMbyowHy)d(0@bzq5daI_b>ZjVg9cC8{ob~k*5f6OM6{ugoCA{+kI|) z+}vW2|I_kMq?D7rldFcasktST=UbeVcs2ih48$P+@c9>7407Kve`}yWyYmn2U3)???|}bqbtvXgccdKvkVVQ% zKhg9?+BHPj8%%jXvzMJ0y`rL}6;h;a(>e5#@~8E8yyZtlFlLES_49rrAL)$n!_p zE5TK4>vHiQ&-PkQ+x*)62Aejr{fxU#xps_`+!bbMeiiJzDl#@WhEV`u+!y@7C;&g8 zfgen%x&`wC>aFPNSI1*iAe><0{pZ9%*Zk;k7r=sf?$X+#@+-GdN&76FYTD?Dl3an3 zH(+7GA&+)Oyh)7_!O`z$=`zBA)E*X$J(Of&h1Qu)f?uH{^#lk?Lw@o?Xe&L%ht(8m ziH_&sw!c<2?9$ERmwa0c_G<6AbXvcPb?=Xm@CK5R8aGm=c4s36HmgG0zLXT50l3kp zR!QYxm`RsA@9y&#D8c9qS<>4<*^pDG^xpi-ue{J~PAn{=$0gqgdT>Klo{c=Z<>0go z*07n+t8`b{YKT?T*sj!^P>EzAvgC5Z9y5Y3M?XXXdQY%bVPV{(PDaH^=w1rrKUv<$ z>mo~?@fCpZL%z)8NhWJxpKi!s9=jr@q0D~q$KXMjI2|X2q$oEX0Q+%4Hzm<-z>sTL zlK8F4{tX63@6j-`98?2FpAIbM=Kk(A3|=}2rALVKgZy4^CC^`dJLOHVVxn#Pg<`9OkjL7q1M+=sOGYulB z&uNkJXy6BRejfb6^-u>!tRfDUgEO5VDg*_b;Kwmq!G>v7>oKipo(?hC0|1HdV+?&;p3p4BD*4Bq%(u!Q7Q{IQ9KNXQ z3+D&tS)oMrkn^JJNeHAc7_yeGXlKU6uSSq!uJvj@K}XvnNjBGWU9MyHx!I;xR~IO? zqHg8@dt_7*@H|gBXvo`azYUs833HlQu{iKhUU6L=H;+!}G;1Fg~Lr`o-zpaH_`?QqKj8Z1vh0o*l!iHGFlF;o9}YE=PS% zhz=<`nUXA0RUg#@1v#uMPXi*JVs71>s>{)=!!yz~`+Kdu>cz$A? znlK}rR-N_2QG6W2lDm)GV*FrvS1=g_k`wxML?rCl{LF<+1C_wX#<}?-n$z}CHJf@; z?2D?pslcHw?Rej;7n!g7lLlW|PIemiC-_!g7YT>ZRpgL4@)wRU_~mY;f0WBLsW-XF z;s|Pl=xoyU9_@S2X`@C(M1AL)gykd^sP<@4I=`Pxsnct&N8RA z9}mldlhZ8Kq~~v2#|ar-wxV8uJq?jyxWjXXCc-7c>WKD=ayM&V*&pj`kRGJqj;OD0 zt79Y5elN&biNe%fY`(D${cSR~jUZ7kfS!O`lhVtGRAcro< z%o6s$iw)a(wdejF=onEozTuc}vC2>E1asvk9%do%dp}yKVLwfrug2kf$Qof4>7m*o zuvC@7nF#L^S8b;(%Wvn07H8Ilo!%;*XIw2Zh zpVW2poi?gKxNlOaZ7;ojHs_mH?I2LO=RZjJLjVsQS?B_B8&4W84;{7RG_nSy*V|oC zfQ3{IF-v_FZH2GJ-?y=Ydz=W!X%ce{e{%^biCK}^O}<(pC&U6OQ9D@>bSnp|+y@A+ zE5%qlY5X;jI=^GmI8c~{9{IEPIeZoB<7dIqkzduW*nx~H^7#$%N#)RSLM_y3G#_bi<+e4v-WU=6Uy$D55_%m0nTJDOW+Wk5riZ5Av}{rqg} zgyJ-l#Sziuc=4d8Dh!`>)Th)yhM8Jyh5_2iVlV4fWd|(vw1?OE?_b-$>d!~{Km~DO z$Wug3R%A`)88;7E-a@bAjeW^fWaQrn=8P=wM;1ElURJ$j`rMkFc_xcZfbrmvx|2IF zu#Ok;#K9kO-NX*$je2d=xRT4*2Uf@V2NeB`52ae}>Ym_zJgAFy{e4v;jvUy*ukH=s zEj-{`b99zq$3?eHi&heRhS7utEGfLQ&!iff9ZwTbQTA)WRQ}Q{K$gp+wT}!mLhnYn7VUZw6eV4?JWn~~-fSZyea<~Eky!OUx>gY2Na%1=2XLd`4p#9zcVMdM+k!$&JZyd7l?rFi%YRH)4B89ia5@ zTT+E1bNL^iX}!}F=0XCg5KC6^B|{ya6f1v-TV9;URFP104t>i3Ss+k!tmT{KH9&^d zPR#bH`lzss!Bn3ge^!xFBS!k3^R@h?v)X}$kgmrU#uKXg1)I;qF$KcP-lBJ}6TA7g zJH!IzZ4dDg%rG6!4qJeyS)g@I_|)`JvjHZ#Q3q$ZdH~sAA$s?ZJWt6yEw}p zllI&X{e+l${$$3hRy8V3FnK(hgix&VMUSbyQN}K3%G+!TaDPc!(mWdYmzILIRohu> zM6`69&uwl0Ig5pVy^gFk?YC9`cBTH~Z;~e3%bhE9WCCI2EMfp$nlPO}m}+zRLGN@i9hF;|XPT&5yFx^WL(k zs0-gTK~;*VT=jOTx^`y4i<@WVr`OVv78G|2u9 zrE}+&ZF7=jAlDQqaUI`*YK7eKbi^;tM_sQAZ$n_;!vZ9>v%f1Gfb`q7EjZB(}7 zjd{#P2}WV({-cM1dF$KiiBt4Wo>z58N=E7ZF&tCu*d-0+q&uF^709DqU&z^_$X&ci z{%CR;%C0R%n9H%G``xKeQS{dJOGJf}m*EJKPu=e2sHQ72z5FFS>?W|RTOK7?*I4sb z%<$`66$3aw+D4d>41UF=bfCh2LnC`5$TSw3BSpkWvN8Tm$Lsb3fBNeXn=H3FEigJT z&@9N=T}k&iR^~}2Ee40=$R&=C)i$lHc%54+{iBy7d%q3`_d8CUb-`heX5O}Cy8?M? zn|D`?!bW>XrVa}p?)c5`sqU~D@+{9bhLZk7dsrn)RBT8N$l~y z4a{g5<83^wF}*01sd%_ZGaI&~UT4WE@?w4du+>UYvgbQQ#iL5pmxp_d^!IKY zTg+trrY*gt-lS>zbzrXj=C2i53y!bEcY!|XoK-j z7?)GKC0=;!IpDLpLsd|#d4s~U=MFaP;(A6hEyK45d2z{moE*WzKZ6>&GHh*DqF!}f0(-w#`bii~Jt z1Kwso?ox_pfhKFGG}NtT9BB8PQw#a;;pU=0{rp5aNXo_05Pkz^X<=_?)bR~u{7592 zM@N~RtR-Yi3r(Tuft%gI{xCPomW$1oM5 zD~1Tj+y%>UNOG%u5-B>*QN{!GuS>R>3xVY|eq@)cu_=|4O~w(8?hd?sUO1}rgApj6 zEJW|o9FM!v`XiRl?zqTF^MxE?-qT=<{!q@SOi3BYBb8Z^0;O*4wB857_DdX?YQ7s_)JY(zIo@Q zWO02xwri>(AYp~Cb>31?)kzN0Q}r+{CAQFc>B3}A**|EG1_Q>-0=Jm3jMv{*F(ne} zLDzzw5Dc{G_u=<~ab)DoY^~fjNkLweUmAnaqvpr2K($w=pL^Ry&*Cs~9}ixGZ|B&I zKbLhhk?_)DI%wUf{AAW|HPc-q;OfK%2*vN-mjfnqUe`%0Xae$A^C2K1)5<4uI_nLc zq1Ut1YE5>>LW@f>knCN0~{Ffh#qr&a@2D=vbg_rZi zYjvm&*N*VQ32*~?P@6hxe!ydi8@BKQ+7KReztXnqBuE+x zTRjIvA3c#B0F_#rtbHSG#@C47zxlkKhJOLfrW$isj7_C6vJh>fVQUMqP!A!D*)1B- zJ`5A~Y>Ao_6%FK$wOumMa@lQ`o(n~T=E@<^R$rd5d@3bn#M3B&mzae%xsz)}k#%LZ zvV#F1G|JoBWtv44#uvmDE{$lOf7&Ts0eLe)gY+68)>>RiC}(0#%o;q_$4(HxM?VU* znKv$^dJA$)$*?4RnajZf5+ZZdT{kn2vfh4=5__wa&^Mq&K)!rzfC6lTFwTyLAZ>?0 zi|3jto!s+TgG5TWoh;c0rd2Yw_vu1sEuh|xuvkxu)+U36!`vn8SWA*e z6=;FK1mxPg-~DE(9sgA$sq_&eMAamI2wQI?8R_#---ny2l$UYZA|HzqdMVNqcguuG zjoyD@KjL&AFs=Qj1ys5cX3?~4UC0-Iir;u3n^0-Ws6nbtN#iQ9+WE`2G@i^6wz^%; zeJJ=7_+i-`EPPzOjWkYT=?j0=am;dC*gHO@ls9tl#e!H^^QPY1QccY>7LlpKHJSx) zaIgL50lY`cqrOlXg4L>6STbCM%>}3hIcIEreb(AF{d_j$qq>fFLQy%>u@Uq7W*wU@El@TQ<A-9HT8Rrnd914l~FJQ-Rfv zoF|9X0|nFtPpIPibZDwk?HC&{3Z%OfLO2bt<8J@S4Z9m zT$Z`(Y7@2OsfjC3l+!PcDc)^8kHwn%c1u3i-r^g0@X9|E4ZmIog8 zJ)PGVX3Bh643(GdrfiGyj9i;mRBz`Z={I=X$sL*3_zSs#*6G@+XMr=Fm5Q&20u2q^% z<_cO8_NA++;pTPKQH(K`3rx6}p%AGfk*`6BX@B8TG!u=|E2&uyf&!yu-_4~|{w0^r z7leg@_Wj}7P%J)wz+7{8d5_%pTQfG-qw^gqQ4Q+dlx#*HAqJD-b-&Yg2&CSha((<~ z*8>s>l9`%nGhIH^F~OngrrnrVk(b!*GY5v2*KS|lq#ObumlW2Hm|&G0qS$s?l8=p@ zWh8q`$ME0L$%nsN7S*2hQG_aGPtsD)=S(Io4S|_3eaA2HZVARpXyqnmb%`r&*vx`A zDRUN6MWvj;9kRde3tADlmGh$6?HUL_^b26^Y~*4wO1>p-d~;;sl_8am{jKcnZD-jL z`L+rQY>FY}Ht>N~cKhvV?|V07QRm@^n#9OSh2EG4BC$6z3UkVZjn}^~$C1ny?aFv|1iVF+{_Y{R9tBIw%icW)4 z%x50MR-Euda=Kq2YwpR7sN{6lrxU4$WS1Ho^2L_QMUfX@2eOiCIncZl*!dY&w|mkS zHT{6EcKo9S^Kn|8>9n`(laI{6=OX?J%mYZ1z`ON!3tJUS8a&-g z-`R~u`8!8wkjhr>1939hce)$ z1;~wesiDrK)_YMDQU}?W%e^)s;b};DV;OI6OhBW;)HV&32JyNd7gxbJvo+WkCi=QS@C7)`^y5 zID(_}9m8}dDsPxw3(RD@#KVPryRH4WL+WteYbpUL@Bw&d>1+wvo{HqKbMrU6r)ncH z=}^;s@g(P>r!A0rqjTa+@|bUn3Yc3Hv&N_o2q|xy#A1z$M>d~ip$P3ZMGQ6Bl||}m z#R!hI1(S(#&(Nx(fM&pC=9gnYL={T%^#MPSloP^JFM;#_o5xm^Y4T-a_Ok-#3($Gf lAEgIcxQYjWWqg-zkxIYPiH6=3@7@2Clb2DEE|)Y3`5!nHBWC~r literal 6063 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%0DuL_RI=yg>2M^Ej87Skp zB)q_fbY;rPk{krhqG4J_{h^8wn)JxXpA@H32%s`^>{84EjM)Q7#BvIvoce&v{i3fD z*b->0re9$JgBYEpynV$01y~KdB{mfMA<(WRt|a%)ak0xtPY3-q&$au*4t1(3hKB}4W*q{ zK#x&7xrOwH#>bV{SZc0~vlUYsB&moPpQJDn0yzDF55g3glEVsY{WU3PGP=ab(F$O} zss1B!6bG#r<@NCktu{m&G|c7?L`=Y74lZaL0X8$uW`;;>z-&D}<&)5UE8HTfQo{Y!dsEk>&qwM zv3+tDL-^7Js(@IxwLcsCH9xXB0ip|nF4P8M6AVvTEuS~=O9ZriZJxc__b!9Pm#dGS zDXyM)|AvcJG|G6=aTvWV+j4EKcbg;ldUn#MB}mmuov-^Df{y$F$$u%xJXJW8h+I(< zwmvfu^&HF}dsDdgykPPY74F?HkD{wds)D@tH^kVDy9Qt*g$=uPB*xPm0=`5t#yCeXM z)LsRM7HmikWDjT)WP2wPVvJU~prWFPPmdi5w_H;5_=ORgN-q-i1)RDW$=AdfQSu8% z@9z!RM87HTS_y zx29cI+32g~C^9s|ILW9TVad%XY(G~538d`63B@S|V=WnUj$f_{#&5A(*xfznUK{OJ zJrkuf()o)usOpHOJ<_(; zEbTE!0XrIqgow@`$1gf3$n9mgnG^vU*C8moK77oAS^;DAO>RsWJ4dPJS zEIPRt@5eR;0N-(l**kKs`5exAo$A|LlBesM=!X+Ce$uG)Rep`kg=Rbk-V(gJFJ}4( zEQ@|Tlyn$1PrL2TuYPmCK8hn1gn&+)Io&Lb0#|jLsT+HC*gvUdU>wl<>a;|D6B>6K zjeS?uvUhvw+>iAY12&qclmOc_eh3VN%CUiC==xMjYqPQ%)g50pbmeP#Als`cx)zol zYTi1Wq<=>hD3?WSPe?7klKY&{tqR?MXC}fUh|_A;gSHJi!XxV-rhpC^r~(vSkqI7A zz$oxYarXC=ZGHVwPlw~9K;xuVWc1ZO5Sa#Wyz4>d|Mdj;`Lcy9fbG=1A%PVkdz*|~ zh~azwY?02v7Xj^z9yu_k0SC?44j%`IUst1;%lxo7C;Y?oO~XG@rzGJ)b=ztZ6g26P zFA&FXPqkUq)yN+HSmlIRSRsNX{ftcbA3ZV*!t~=xCfClX0$B++BqpiIX}=4t@85<< z=hBHkuarYq?Mq9YPJe+|juDrgQ&9>)1?~Ogm38af``4kDr0@Ua2d0y<5ES%I=0gXi z+s6g@i8=aIgdD{M9PYbD3AdXN9gN2-=cGOvnwkl?snIW=?co? zsRVfj_T>0j*&Cr`jt8;-Wa9H2BE%$CS;~iGqYgnwJ1~{K;l-1aYTrMhpvS^bIjH=+ z#24*VOccZFLTC0K$zVLt82>*U<~>|KHu|&I1{*-r9zSgNKePO!l#*nLxS{|50DtIU AkN^Mx