From e7bf5e60aecad2cae72066945ef1959f0ece4c32 Mon Sep 17 00:00:00 2001 From: Harrison Ravazzolo <38767391+harrisonravazzolo@users.noreply.github.com> Date: Mon, 1 Jun 2026 06:31:55 -0700 Subject: [PATCH] Windows FMA - Amazon WorkSpaces (#46304) ## Summary by CodeRabbit * **New Features** * Added Amazon WorkSpaces support on Windows: app listing, version entry, installer/uninstaller metadata, and a UI icon. * **Improvements** * Relaxed input validation to allow comma (,) and ampersand (&) characters in query filters. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46304?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) --------- Co-authored-by: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> --- cmd/maintained-apps/validate/main.go | 2 +- .../inputs/winget/amazon-workspaces.json | 10 ++++++++ .../outputs/amazon-workspaces/windows.json | 23 ++++++++++++++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ .../components/icons/AmazonWorkspaces.tsx | 14 +++++++++++ .../SoftwarePage/components/icons/index.ts | 2 ++ .../app-icon-amazon-workspaces-60x60@2x.png | Bin 0 -> 7845 bytes 7 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 ee/maintained-apps/inputs/winget/amazon-workspaces.json create mode 100644 ee/maintained-apps/outputs/amazon-workspaces/windows.json create mode 100644 frontend/pages/SoftwarePage/components/icons/AmazonWorkspaces.tsx create mode 100644 website/assets/images/app-icon-amazon-workspaces-60x60@2x.png diff --git a/cmd/maintained-apps/validate/main.go b/cmd/maintained-apps/validate/main.go index e6ea010740..173b93fd18 100644 --- a/cmd/maintained-apps/validate/main.go +++ b/cmd/maintained-apps/validate/main.go @@ -487,7 +487,7 @@ func detectApplicationChange(installationSearchDirectory string, appListPre, app func validateSqlInput(input string) error { // Allow alphanumeric, spaces, dots, hyphens, underscores, forward/back slashes, colons, parentheses, pluses. - if matched, _ := regexp.MatchString(`^[a-zA-Z0-9\s.\-_/\\:()+]*$`, input); !matched { + if matched, _ := regexp.MatchString(`^[a-zA-Z0-9\s.\-_/\\:()+,&]*$`, input); !matched { return fmt.Errorf("invalid characters in input: %s", input) } diff --git a/ee/maintained-apps/inputs/winget/amazon-workspaces.json b/ee/maintained-apps/inputs/winget/amazon-workspaces.json new file mode 100644 index 0000000000..1f9944704f --- /dev/null +++ b/ee/maintained-apps/inputs/winget/amazon-workspaces.json @@ -0,0 +1,10 @@ +{ + "name": "Amazon WorkSpaces", + "slug": "amazon-workspaces/windows", + "package_identifier": "Amazon.WorkspacesClient", + "unique_identifier": "Amazon WorkSpaces", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/amazon-workspaces/windows.json b/ee/maintained-apps/outputs/amazon-workspaces/windows.json new file mode 100644 index 0000000000..616cdd3af3 --- /dev/null +++ b/ee/maintained-apps/outputs/amazon-workspaces/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "5.32.2.5905", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Amazon WorkSpaces' AND publisher = 'Amazon Web Services, Inc';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Amazon WorkSpaces' AND publisher = 'Amazon Web Services, Inc' AND version_compare(version, '5.32.2.5905') < 0);" + }, + "installer_url": "https://d2td7dqidlhjx7.cloudfront.net/prod/global/windows/Amazon+WorkSpaces.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "b645e295", + "sha256": "d92852c27efd33f349da727f6a7d2c5622441bf7fdb1a00a3132e4a4988f3f96", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{CB7B8EA8-3D5A-4233-A9CB-31A692E24E62}" + } + ], + "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", + "b645e295": "# 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('{CB7B8EA8-3D5A-4233-A9CB-31A692E24E62}')) {\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/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 320cb81c5a..42e6d499f4 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -148,6 +148,13 @@ "unique_identifier": "Amazon Corretto (x64)", "description": "Amazon Corretto 25 is a no-cost, multiplatform, production-ready distribution of OpenJDK 25." }, + { + "name": "Amazon WorkSpaces", + "slug": "amazon-workspaces/windows", + "platform": "windows", + "unique_identifier": "Amazon WorkSpaces", + "description": "Amazon WorkSpaces provides secure, managed virtual desktop infrastructure (VDI) in the cloud." + }, { "name": "Android Studio", "slug": "android-studio/darwin", diff --git a/frontend/pages/SoftwarePage/components/icons/AmazonWorkspaces.tsx b/frontend/pages/SoftwarePage/components/icons/AmazonWorkspaces.tsx new file mode 100644 index 0000000000..d991854d36 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AmazonWorkspaces.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AmazonWorkspaces = (props: SVGProps) => ( + + + +); +export default AmazonWorkspaces; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 4399161670..63d022f51c 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -6,6 +6,7 @@ import { ISoftware } from "interfaces/software"; import { matchLoosePrefixToKey } from "utilities/strings/stringUtils"; import AmazonCorretto25 from "./AmazonCorretto25"; +import AmazonWorkspaces from "./AmazonWorkspaces"; import AnotherRedisDesktopManager from "./AnotherRedisDesktopManager"; import AzulZulu25Jdk from "./AzulZulu25Jdk"; import AzulZulu25Jre from "./AzulZulu25Jre"; @@ -300,6 +301,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "amazon chime": AmazonChime, "amazon corretto 25": AmazonCorretto25, "amazon dcv": AmazonDCV, + "amazon workspaces": AmazonWorkspaces, androidPlayStore: AndroidPlayStore, "android studio": AndroidStudio, anka: Anka, diff --git a/website/assets/images/app-icon-amazon-workspaces-60x60@2x.png b/website/assets/images/app-icon-amazon-workspaces-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..13b1d5003a36a9b88914e78b8bc90dcd19b39911 GIT binary patch literal 7845 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 W>$;6ofcfvwR}}>f`7&9{SN{hi{E@o= literal 0 HcmV?d00001