Resources/FirefoxPreferences.ps1

function doFirefox {
    param (
        [Parameter(Mandatory = $true)]
        [string]$path
    )
    $currentFirefoxRegKey = Get-ChildItem -Path $path | Select-Object -Last 1
    $installDirRegKey = $currentFirefoxRegKey | Get-ChildItem | Where-Object PSChildName -EQ 'Main'
    $InstallationPath = $installDirRegKey | Get-ItemProperty | Select-Object -ExpandProperty 'Install Directory'

    # Calculate Firefox local-settings path
    $LocalSettingsPath = "$InstallationPath\defaults\pref\local-settings.js"

    # Calculate Firefox config path
    $preferenceConfigFilename = 'mozilla.cfg'
    if (Test-Path $LocalSettingsPath) {
        foreach ($line in (Get-Content $LocalSettingsPath)) {
            if ($_ -match "^pref\(`"general\.config\.filename`",\s?`"([\w\-. ]+\.cfg)`"\);") {
                $preferenceConfigFilename = $Matches[1]
            }
        }
    }
    $PreferenceConfigPath = "$InstallationPath\$preferenceConfigFilename"

    # Gather lines into lockPref list
    # if (-not (Test-Path $LocalSettingsPath) -or
    # -not (Test-Path $PreferenceConfigPath)) {
    # return $null
    # }

    $boolRegex = '(?<bool>true|false)'
    $numberRegex = '(?<number>\d+)'
    $stringRegex = '"(?<string>(\\.|[^`"\\])*)"'
    $lineRegex = "^lockPref\s*\(\s*`"([\w.-]+)`"\s*,\s*({0}|{1}|{2})\s*\);" -f $boolRegex, $numberRegex, $stringRegex

    $LockedPreferences = @()
    if (Test-Path $PreferenceConfigPath) {
        foreach ($line in (Get-Content $PreferenceConfigPath)) {
            if ($line -match $lineRegex) {
                $value = $null
                if ($Matches.Keys -contains "bool") {
                    $value = [bool]::Parse($Matches["bool"])
                }
                elseif ($Matches.Keys -contains "number") {
                    $value = [int]::Parse($Matches["number"])
                }
                elseif ($Matches.Keys -contains "string") {
                    $value = $Matches["string"]
                }

                $LockedPreferences += @{ Name = $Matches[1]; Value = $value }
            }
        }
    }

    return [PSCustomObject] @{
        InstallationPath = $InstallationPath
        LocalSettingsPath = $LocalSettingsPath
        PreferenceConfigPath = $PreferenceConfigPath
        LockedPreferences = $LockedPreferences
    }


    $currentFirefoxRegKey = Get-ChildItem -Path $path | Select-Object -Last 1
    $installDirRegKey = $currentFirefoxRegKey | Get-ChildItem | Where-Object PSChildName -EQ 'Main'
    $InstallationPath = $installDirRegKey | Get-ItemProperty | Select-Object -ExpandProperty 'Install Directory'

    # Calculate Firefox local-settings path
    $LocalSettingsPath = "$InstallationPath\defaults\pref\local-settings.js"

    # Calculate Firefox config path
    $preferenceConfigFilename = 'mozilla.cfg'
    if (Test-Path $LocalSettingsPath) {
        foreach ($line in (Get-Content $LocalSettingsPath)) {
            if ($_ -match "^pref\(`"general\.config\.filename`",\s?`"([\w\-. ]+\.cfg)`"\);") {
                $preferenceConfigFilename = $Matches[1]
            }
        }
    }
    $PreferenceConfigPath = "$InstallationPath\$preferenceConfigFilename"

    # Gather lines into lockPref list
    # if (-not (Test-Path $LocalSettingsPath) -or
    # -not (Test-Path $PreferenceConfigPath)) {
    # return $null
    # }

    $boolRegex = '(?<bool>true|false)'
    $numberRegex = '(?<number>\d+)'
    $stringRegex = '"(?<string>(\\.|[^`"\\])*)"'
    $lineRegex = "^lockPref\s*\(\s*`"([\w.-]+)`"\s*,\s*({0}|{1}|{2})\s*\);" -f $boolRegex, $numberRegex, $stringRegex

    $LockedPreferences = @()
    if (Test-Path $PreferenceConfigPath) {
        foreach ($line in (Get-Content $PreferenceConfigPath)) {
            if ($line -match $lineRegex) {
                $value = $null
                if ($Matches.Keys -contains "bool") {
                    $value = [bool]::Parse($Matches["bool"])
                }
                elseif ($Matches.Keys -contains "number") {
                    $value = [int]::Parse($Matches["number"])
                }
                elseif ($Matches.Keys -contains "string") {
                    $value = $Matches["string"]
                }

                $LockedPreferences += @{ Name = $Matches[1]; Value = $value }
            }
        }
    }

    return [PSCustomObject] @{
        InstallationPath = $InstallationPath
        LocalSettingsPath = $LocalSettingsPath
        PreferenceConfigPath = $PreferenceConfigPath
        LockedPreferences = $LockedPreferences
    }
}

# Calculate Firefox installation path
if (Test-Path 'HKLM:\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox\') {
    $firefoxRegKeyPath = 'HKLM:\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox\'
    doFirefox -path $firefoxRegKeyPath
}if (Test-Path 'HKLM:\SOFTWARE\Mozilla\Mozilla Firefox\') {
    $firefoxRegKeyPath = 'HKLM:\SOFTWARE\Mozilla\Mozilla Firefox\'
    doFirefox -path $firefoxRegKeyPath
}else {
    return [PSCustomObject] @{
        InstallationPath = "Seems like Firefox is not installed on this system."
        LocalSettingsPath = "Seems like Firefox is not installed on this system."
        PreferenceConfigPath = "Seems like Firefox is not installed on this system."
        LockedPreferences = "Seems like Firefox is not installed on this system."
    }
}