diff --git a/ee/maintained-apps/inputs/winget/flexwhere.json b/ee/maintained-apps/inputs/winget/flexwhere.json new file mode 100644 index 0000000000..77a272f0ae --- /dev/null +++ b/ee/maintained-apps/inputs/winget/flexwhere.json @@ -0,0 +1,11 @@ +{ + "name": "FlexWhere for Desktop", + "slug": "flexwhere/windows", + "package_identifier": "Dutchview.Flexwhere", + "unique_identifier": "Flexwhere for Desktop", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/winget/fortify.json b/ee/maintained-apps/inputs/winget/fortify.json new file mode 100644 index 0000000000..591b3f8267 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/fortify.json @@ -0,0 +1,12 @@ +{ + "name": "Fortify", + "slug": "fortify/windows", + "package_identifier": "PeculiarVentures.Fortify", + "unique_identifier": "Fortify", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "installer_locale": "en-US", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1", + "default_categories": ["Security"] +} diff --git a/ee/maintained-apps/inputs/winget/foxit-pdf-editor.json b/ee/maintained-apps/inputs/winget/foxit-pdf-editor.json new file mode 100644 index 0000000000..1cb349a35f --- /dev/null +++ b/ee/maintained-apps/inputs/winget/foxit-pdf-editor.json @@ -0,0 +1,12 @@ +{ + "name": "Foxit PDF Editor", + "slug": "foxit-pdf-editor/windows", + "package_identifier": "Foxit.PhantomPDF", + "unique_identifier": "Foxit PDF Editor", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/winget/foxit-pdf-reader.json b/ee/maintained-apps/inputs/winget/foxit-pdf-reader.json new file mode 100644 index 0000000000..73da4fe144 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/foxit-pdf-reader.json @@ -0,0 +1,12 @@ +{ + "name": "Foxit PDF Reader", + "slug": "foxit-pdf-reader/windows", + "package_identifier": "Foxit.FoxitReader", + "unique_identifier": "Foxit PDF Reader", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/winget/freecad.json b/ee/maintained-apps/inputs/winget/freecad.json new file mode 100644 index 0000000000..945aaeeb44 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/freecad.json @@ -0,0 +1,13 @@ +{ + "name": "FreeCAD", + "slug": "freecad/windows", + "package_identifier": "FreeCAD.FreeCAD", + "unique_identifier": "FreeCAD", + "fuzzy_match_name": "FreeCAD%", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1 new file mode 100644 index 0000000000..5d16402e37 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1 @@ -0,0 +1,53 @@ +# Uninstalls Flexwhere for Desktop. +# +# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files +# and make msiexec roll back the uninstall. Stop anything running from the +# install dir (plus known process names) FIRST, then resolve the ProductCode(s) +# via the stable UpgradeCode and msiexec /x each. + +$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}' +$softwareName = 'Flexwhere for Desktop' +$successCodes = @(0, 3010, 1641) + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +try { + +# Stop the app's processes so the MSI uninstall isn't rolled back by locked files. +$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } | + Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1 +if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) { + $loc = $entry.InstallLocation.TrimEnd('\') + Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } | + ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue } +} +foreach ($p in @("Flexwhere for Desktop")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 3 + +# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each. +$inst = New-Object -ComObject "WindowsInstaller.Installer" +$productCodes = @($inst.RelatedProducts($upgradeCode)) +if ($productCodes.Count -eq 0) { + Write-Host "No products found for upgrade code $upgradeCode" + Exit 1 +} + +foreach ($productCode in $productCodes) { + Write-Host "Uninstalling product code: $productCode" + $process = Start-Process msiexec.exe ` + -ArgumentList "/x $productCode /quiet /norestart" ` + -NoNewWindow -PassThru -Wait + Write-Host "Uninstall exit code: $($process.ExitCode)" + if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode } +} + +Exit 0 + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1 new file mode 100644 index 0000000000..a89d08f929 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1 @@ -0,0 +1,53 @@ +# Uninstalls Fortify. +# +# Fortify auto-starts a tray process (no Windows service), which can hold files +# and make msiexec roll back the uninstall. Stop anything running from the +# install dir (plus known process names) FIRST, then resolve the ProductCode(s) +# via the stable UpgradeCode and msiexec /x each. + +$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}' +$softwareName = 'Fortify' +$successCodes = @(0, 3010, 1641) + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +try { + +# Stop the app's processes so the MSI uninstall isn't rolled back by locked files. +$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } | + Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1 +if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) { + $loc = $entry.InstallLocation.TrimEnd('\') + Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } | + ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue } +} +foreach ($p in @("Fortify")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 3 + +# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each. +$inst = New-Object -ComObject "WindowsInstaller.Installer" +$productCodes = @($inst.RelatedProducts($upgradeCode)) +if ($productCodes.Count -eq 0) { + Write-Host "No products found for upgrade code $upgradeCode" + Exit 1 +} + +foreach ($productCode in $productCodes) { + Write-Host "Uninstalling product code: $productCode" + $process = Start-Process msiexec.exe ` + -ArgumentList "/x $productCode /quiet /norestart" ` + -NoNewWindow -PassThru -Wait + Write-Host "Uninstall exit code: $($process.ExitCode)" + if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode } +} + +Exit 0 + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1 new file mode 100644 index 0000000000..6e3bd052aa --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1 @@ -0,0 +1,34 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart +# performs a silent per-machine install. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + if (-not (Test-Path $exeFilePath)) { + Write-Host "Error: Installer file not found at: $exeFilePath" + Exit 1 + } + + $processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/quiet" + PassThru = $true + Wait = $true + NoNewWindow = $true + } + + $process = Start-Process @processOptions + $exitCode = $process.ExitCode + Write-Host "Install exit code: $exitCode" + + # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated + if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } + Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1 new file mode 100644 index 0000000000..82253470c6 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1 @@ -0,0 +1,64 @@ +# Uninstalls Foxit PDF Editor. +# +# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater +# service; its visible ARP entry is the inner MSI (its UninstallString uses +# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the +# Foxit services/processes first so files aren't locked, then resolve the +# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart" +# (never reuse the /I from the registry string). The ARP entry lives in the +# WOW6432Node (32-bit) hive even on x64. + +$softwareName = "Foxit PDF Editor" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' +$successCodes = @(0, 3010, 1641) +$exitCode = $null + +try { + +foreach ($svc in @("FoxitPhantomPDFUpdateService")) { + Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue +} +foreach ($p in @("FoxitPDFEditor", "FoxitPhantomPDF", "FoxitUpdater")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 3 + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1 +if (-not $selected) { + Write-Host "Uninstall entry not found for '$softwareName'." + Exit 1 +} + +# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull +# the first GUID out of the UninstallString. Never carry over its /I switch. +$productCode = $selected.PSChildName +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + $raw = $selected.UninstallString + if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] } +} +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + Write-Host "Could not determine ProductCode for '$softwareName'." + Exit 1 +} + +Write-Host "Uninstalling product code: $productCode" +$process = Start-Process msiexec.exe ` + -ArgumentList "/x $productCode /qn /norestart" ` + -NoNewWindow -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($successCodes -contains $exitCode) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1 new file mode 100644 index 0000000000..5f682f9ba1 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1 @@ -0,0 +1,34 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart +# performs a silent per-machine install. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + if (-not (Test-Path $exeFilePath)) { + Write-Host "Error: Installer file not found at: $exeFilePath" + Exit 1 + } + + $processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/quiet" + PassThru = $true + Wait = $true + NoNewWindow = $true + } + + $process = Start-Process @processOptions + $exitCode = $process.ExitCode + Write-Host "Install exit code: $exitCode" + + # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated + if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } + Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1 new file mode 100644 index 0000000000..a5582af442 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1 @@ -0,0 +1,64 @@ +# Uninstalls Foxit PDF Reader. +# +# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater +# service; its visible ARP entry is the inner MSI (its UninstallString uses +# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the +# Foxit services/processes first so files aren't locked, then resolve the +# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart" +# (never reuse the /I from the registry string). The ARP entry lives in the +# WOW6432Node (32-bit) hive even on x64. + +$softwareName = "Foxit PDF Reader" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' +$successCodes = @(0, 3010, 1641) +$exitCode = $null + +try { + +foreach ($svc in @("FoxitPDFReaderUpdateService")) { + Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue +} +foreach ($p in @("FoxitPDFReader", "FoxitReader", "FoxitUpdater")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 3 + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1 +if (-not $selected) { + Write-Host "Uninstall entry not found for '$softwareName'." + Exit 1 +} + +# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull +# the first GUID out of the UninstallString. Never carry over its /I switch. +$productCode = $selected.PSChildName +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + $raw = $selected.UninstallString + if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] } +} +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + Write-Host "Could not determine ProductCode for '$softwareName'." + Exit 1 +} + +Write-Host "Uninstalling product code: $productCode" +$process = Start-Process msiexec.exe ` + -ArgumentList "/x $productCode /qn /norestart" ` + -NoNewWindow -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($successCodes -contains $exitCode) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1 new file mode 100644 index 0000000000..a461c18b0d --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1 @@ -0,0 +1,27 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and +# /AllUsers forces the machine-wide install (HKLM + C:\Program Files). + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/AllUsers /S" + PassThru = $true + Wait = $true +} + +$process = Start-Process @processOptions +$exitCode = $process.ExitCode + +Write-Host "Install exit code: $exitCode" +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1 new file mode 100644 index 0000000000..bea7e1fdd5 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1 @@ -0,0 +1,57 @@ +# Uninstalls FreeCAD. +# +# FreeCAD (MultiUser NSIS) registers a versioned DisplayName ("FreeCAD 1.1.1") +# under HKLM when installed with /AllUsers, so match on the "FreeCAD" prefix. +# Its QuietUninstallString runs "Uninstall-FreeCAD.exe" /S (real silent, no +# service to block removal). + +$softwareNameLike = "FreeCAD*" +$publisherLike = "FreeCAD*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike -and $_.Publisher -like $publisherLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } + +# Parse exe + args (quoted / unquoted / bare). +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# NSIS uninstallers require /S for a silent uninstall. +if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index f56dbfd42c..7b0cb82098 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -3312,6 +3312,13 @@ "unique_identifier": "net.flexoptix.flexoptix.app", "description": "FLEXOPTIX App is a connect to your FLEXBOX without cables and configure transceivers." }, + { + "name": "FlexWhere for Desktop", + "slug": "flexwhere/windows", + "platform": "windows", + "unique_identifier": "Flexwhere for Desktop", + "description": "FlexWhere for Desktop shows real-time workplace and colleague availability from FlexWhere." + }, { "name": "Fluid", "slug": "fluid/darwin", @@ -3382,6 +3389,27 @@ "unique_identifier": "com.binarynights.ForkLift-4", "description": "ForkLift is a finder replacement and FTP, SFTP, WebDAV and Amazon s3 client." }, + { + "name": "Fortify", + "slug": "fortify/windows", + "platform": "windows", + "unique_identifier": "Fortify", + "description": "Fortify enables cross-browser use of local certificates and smart cards." + }, + { + "name": "Foxit PDF Editor", + "slug": "foxit-pdf-editor/windows", + "platform": "windows", + "unique_identifier": "Foxit PDF Editor", + "description": "Foxit PDF Editor is a desktop application for creating and editing PDF documents." + }, + { + "name": "Foxit PDF Reader", + "slug": "foxit-pdf-reader/windows", + "platform": "windows", + "unique_identifier": "Foxit PDF Reader", + "description": "Foxit PDF Reader is a desktop application for viewing and annotating PDF documents." + }, { "name": "Framer", "slug": "framer/darwin", @@ -3410,6 +3438,13 @@ "unique_identifier": "org.freedownloadmanager.fdm6", "description": "Free Download Manager is a download accelerator and organizer." }, + { + "name": "FreeCAD", + "slug": "freecad/windows", + "platform": "windows", + "unique_identifier": "FreeCAD", + "description": "FreeCAD is a general-purpose, open-source parametric 3D CAD modeler." + }, { "name": "FreeFileSync", "slug": "freefilesync/darwin", diff --git a/ee/maintained-apps/outputs/flexwhere/windows.json b/ee/maintained-apps/outputs/flexwhere/windows.json new file mode 100644 index 0000000000..c000db8562 --- /dev/null +++ b/ee/maintained-apps/outputs/flexwhere/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "3.5", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview' AND version_compare(version, '3.5') < 0);" + }, + "installer_url": "https://s3.eu-central-1.amazonaws.com/releases.flexwhere.net/Flexwhere+for+Desktop+3.5.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "a679a246", + "sha256": "50786b5d742a5f90ede3790e8a47153eaf3137cf1c6b3dc9e786ba3363d0ef70", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{5916547D-CBFA-451B-AF68-D475E2DA9022}" + } + ], + "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", + "a679a246": "# Uninstalls Flexwhere for Desktop.\n#\n# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}'\n$softwareName = 'Flexwhere for Desktop'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Flexwhere for Desktop\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/fortify/windows.json b/ee/maintained-apps/outputs/fortify/windows.json new file mode 100644 index 0000000000..43e61725c1 --- /dev/null +++ b/ee/maintained-apps/outputs/fortify/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "2.1.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures' AND version_compare(version, '2.1.0') < 0);" + }, + "installer_url": "https://github.com/PeculiarVentures/fortify-releases/releases/download/v2.1.0/Fortify_2.1.0_x64_en-US.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "132b8cb2", + "sha256": "57daec289ba8298d591427014e8ef3339d019907a207282ba61393fd271df04d", + "default_categories": [ + "Security" + ], + "upgrade_code": "{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}" + } + ], + "refs": { + "132b8cb2": "# Uninstalls Fortify.\n#\n# Fortify auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}'\n$softwareName = 'Fortify'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Fortify\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "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" + } +} diff --git a/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json b/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json new file mode 100644 index 0000000000..dd4692d511 --- /dev/null +++ b/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "14.0.5.33580", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '14.0.5.33580') < 0);" + }, + "installer_url": "https://cdn01.foxitsoftware.com/product/phantomPDF/desktop/win/14.0.5/FoxitPDFEditor1405_L10N_Setup_x64.exe", + "install_script_ref": "a6208245", + "uninstall_script_ref": "5d55608a", + "sha256": "764aa7ca2679c568539ada4dfa4b1f7de91f9c006fdb8fb98489dea0bce354f7", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "5d55608a": "# Uninstalls Foxit PDF Editor.\n#\n# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Editor\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\nforeach ($svc in @(\"FoxitPhantomPDFUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFEditor\", \"FoxitPhantomPDF\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" `\n -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n", + "a6208245": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/foxit-pdf-reader/windows.json b/ee/maintained-apps/outputs/foxit-pdf-reader/windows.json new file mode 100644 index 0000000000..0ff068a69b --- /dev/null +++ b/ee/maintained-apps/outputs/foxit-pdf-reader/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2026.1.2.36540", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '2026.1.2.36540') < 0);" + }, + "installer_url": "https://cdn01.foxitsoftware.com/product/reader/desktop/win/2026.1.2/FoxitPDFReader202612_L10N_Setup_x64.exe", + "install_script_ref": "4ce619b8", + "uninstall_script_ref": "8dbc0197", + "sha256": "74bb18acd4970f2596d63a05a83421e256d272c37c12216de69984e3244c6485", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "4ce619b8": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "8dbc0197": "# Uninstalls Foxit PDF Reader.\n#\n# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Reader\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\nforeach ($svc in @(\"FoxitPDFReaderUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFReader\", \"FoxitReader\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" `\n -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n" + } +} diff --git a/ee/maintained-apps/outputs/freecad/windows.json b/ee/maintained-apps/outputs/freecad/windows.json new file mode 100644 index 0000000000..a3335540ce --- /dev/null +++ b/ee/maintained-apps/outputs/freecad/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.1.1", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team' AND version_compare(version, '1.1.1') < 0);" + }, + "installer_url": "https://github.com/FreeCAD/FreeCAD/releases/download/1.1.1/FreeCAD_1.1.1-Windows-x86_64-py311-installer.exe", + "install_script_ref": "1cf2c1f5", + "uninstall_script_ref": "6baebf4c", + "sha256": "3e4caf58cc1d82e4e8d726572f741ae664b6e91a77c4d3cb59102d9b8bd51feb", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "1cf2c1f5": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and\n# /AllUsers forces the machine-wide install (HKLM + C:\\Program Files).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/AllUsers /S\"\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "6baebf4c": "# Uninstalls FreeCAD.\n#\n# FreeCAD (MultiUser NSIS) registers a versioned DisplayName (\"FreeCAD 1.1.1\")\n# under HKLM when installed with /AllUsers, so match on the \"FreeCAD\" prefix.\n# Its QuietUninstallString runs \"Uninstall-FreeCAD.exe\" /S (real silent, no\n# service to block removal).\n\n$softwareNameLike = \"FreeCAD*\"\n$publisherLike = \"FreeCAD*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike -and $_.Publisher -like $publisherLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Flexwhere.tsx b/frontend/pages/SoftwarePage/components/icons/Flexwhere.tsx new file mode 100644 index 0000000000..62bd0235eb --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Flexwhere.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Flexwhere = (props: SVGProps) => ( + + + +); +export default Flexwhere; diff --git a/frontend/pages/SoftwarePage/components/icons/Fortify.tsx b/frontend/pages/SoftwarePage/components/icons/Fortify.tsx new file mode 100644 index 0000000000..4d8c6f761a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fortify.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fortify = (props: SVGProps) => ( + + + +); +export default Fortify; diff --git a/frontend/pages/SoftwarePage/components/icons/FoxitPdfEditor.tsx b/frontend/pages/SoftwarePage/components/icons/FoxitPdfEditor.tsx new file mode 100644 index 0000000000..febb7fc4c3 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FoxitPdfEditor.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FoxitPdfEditor = (props: SVGProps) => ( + + + +); +export default FoxitPdfEditor; diff --git a/frontend/pages/SoftwarePage/components/icons/FoxitPdfReader.tsx b/frontend/pages/SoftwarePage/components/icons/FoxitPdfReader.tsx new file mode 100644 index 0000000000..1ccc51aabd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FoxitPdfReader.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FoxitPdfReader = (props: SVGProps) => ( + + + +); +export default FoxitPdfReader; diff --git a/frontend/pages/SoftwarePage/components/icons/Freecad.tsx b/frontend/pages/SoftwarePage/components/icons/Freecad.tsx new file mode 100644 index 0000000000..88b230783b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Freecad.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Freecad = (props: SVGProps) => ( + + + +); +export default Freecad; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 138b1ff59d..a122c9c37d 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -385,6 +385,7 @@ import Firefox from "./Firefox"; import Fission from "./Fission"; import FleetDesktop from "./FleetDesktop"; import Flexoptix from "./Flexoptix"; +import Flexwhere from "./Flexwhere"; import Fluid from "./Fluid"; import FluxApp from "./FluxApp"; import FocusriteControl2 from "./FocusriteControl2"; @@ -394,14 +395,18 @@ import Fontlab from "./Fontlab"; import Forecast from "./Forecast"; import Fork from "./Fork"; import Forklift from "./Forklift"; +import Fortify from "./Fortify"; import FourKSlideshowMaker from "./FourKSlideshowMaker"; import FourKStogram from "./FourKStogram"; import FourKVideoDownloader from "./FourKVideoDownloader"; import FourKVideoDownloaderPlus from "./FourKVideoDownloaderPlus"; import FourKVideoToMp3 from "./FourKVideoToMp3"; import FourKYoutubeToMp3 from "./FourKYoutubeToMp3"; +import FoxitPdfEditor from "./FoxitPdfEditor"; +import FoxitPdfReader from "./FoxitPdfReader"; import Framer from "./Framer"; import Franz from "./Franz"; +import Freecad from "./Freecad"; import FreeDownloadManager from "./FreeDownloadManager"; import Freefilesync from "./Freefilesync"; import Front from "./Front"; @@ -1492,6 +1497,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { fission: Fission, "fleet desktop": FleetDesktop, "flexoptix app": Flexoptix, + flexwhere: Flexwhere, fluid: Fluid, "focusrite control 2": FocusriteControl2, folx: Folx, @@ -1500,9 +1506,13 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { forecast: Forecast, fork: Fork, forklift: Forklift, + fortify: Fortify, + "foxit pdf editor": FoxitPdfEditor, + "foxit pdf reader": FoxitPdfReader, framer: Framer, franz: Franz, "free download manager": FreeDownloadManager, + freecad: Freecad, freefilesync: Freefilesync, front: Front, fsmonitor: Fsmonitor, diff --git a/website/assets/images/app-icon-flexwhere-60x60@2x.png b/website/assets/images/app-icon-flexwhere-60x60@2x.png new file mode 100644 index 0000000000..bf205fea5a Binary files /dev/null and b/website/assets/images/app-icon-flexwhere-60x60@2x.png differ diff --git a/website/assets/images/app-icon-fortify-60x60@2x.png b/website/assets/images/app-icon-fortify-60x60@2x.png new file mode 100644 index 0000000000..17ae33442f Binary files /dev/null and b/website/assets/images/app-icon-fortify-60x60@2x.png differ diff --git a/website/assets/images/app-icon-foxit-pdf-editor-60x60@2x.png b/website/assets/images/app-icon-foxit-pdf-editor-60x60@2x.png new file mode 100644 index 0000000000..8e5832545b Binary files /dev/null and b/website/assets/images/app-icon-foxit-pdf-editor-60x60@2x.png differ diff --git a/website/assets/images/app-icon-foxit-pdf-reader-60x60@2x.png b/website/assets/images/app-icon-foxit-pdf-reader-60x60@2x.png new file mode 100644 index 0000000000..4a35467b9e Binary files /dev/null and b/website/assets/images/app-icon-foxit-pdf-reader-60x60@2x.png differ diff --git a/website/assets/images/app-icon-freecad-60x60@2x.png b/website/assets/images/app-icon-freecad-60x60@2x.png new file mode 100644 index 0000000000..cc332d87ad Binary files /dev/null and b/website/assets/images/app-icon-freecad-60x60@2x.png differ