diff --git a/COMMITTERS.md b/COMMITTERS.md index a57979dad..ca8272fe3 100644 --- a/COMMITTERS.md +++ b/COMMITTERS.md @@ -152,3 +152,57 @@ References * [http://pivotallabs.com/git-rebase-onto/ (Archive)](https://web.archive.org/web/20150709101404/http://pivotallabs.com:80/git-rebase-onto/) * http://git-scm.com/book/ch3-6.html + +## Generating and Updating Cmdlet Documentation + +Documentation for the cmdlets in the Chocolatey.PowerShell project is maintained as `*.md` files in the [chocolatey/docs](https://github.com/chocolatey/docs) repository, under `input/en-us/create/cmdlets`. +When making changes to a cmdlet or adding a new one, we need to ensure that those Markdown files get updated, and that those changes are propagated back to this repository in the [`Chocolatey.PowerShell.dll-help.xml`](./src/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-Help.xml) file in the repository. + +Before working with this, be sure to clone the `chocolatey/docs` repository locally. +If your local copy of the docs repository is not located at `../docs` relative to this folder, you will need to specify the `-DocsRepositoryPath` parameter whenever calling the `update-cmdlet-documentation.ps1` script. + +### Generating Documentation for a new Cmdlet + +Run the `update-cmdlet-documentation.ps1` script with the `-NewCommand` parameter, specifying the name of the cmdlet(s) that you've added: + +```powershell +./update-cmdlet-documentation.ps1 -NewCommand Test-NewChocolateyCommand +``` + +Once this completes, you will get a warning that the documentation template needs to be filled out and the newly-generated documentation file will open in your default editor for `*.md` files. + +### Updating Documentation For an Existing Cmdlet + +Run the `update-cmdlet-documentation.ps1` script: + +```powershell +./update-cmdlet-documentation.ps1 +``` + +### Generating the `Chocolatey.PowerShell.dll-help.xml` External Help Documentation + +Once new files have been generated, in the `chocolatey/docs` repository, make any additional changes needed to the files. +Note that these files will need to be compatible both with PlatyPS and the docs repository Markdown formatting. +As such, for new files you will need to sure the additional frontmatter is added. +A complete frontmatter block for these files looks like this: + +```md +--- +Description: Information on Cmdlet-Name cmdlet +external help file: Chocolatey.PowerShell.dll-Help.xml +Module Name: Chocolatey.PowerShell +online version: https://docs.chocolatey.org/en-us/create/functions/cmdlet-name +Order: 70 +schema: 2.0.0 +Title: Cmdlet-Name +xref: cmdlet-name +--- +``` + +Some files may also have a `RedirectFrom: [ ... ]` frontmatter entry. +This is not required for new files, but existing files (or files added for a cmdlet that is a rewrite of a pre-existing command) should retain their existing redirects. + +Run the `update-cmdlet-documentation.ps1` script once more, and add the changes to the `Chocolatey.PowerShell.dll-help.xml` file to a commit. + +Finally, add the changes to a commit on a new branch in the `docs` repository and submit a PR for any changes there as well, alongside the PR to any changes made in this repository. +If you are rewriting a cmdlet from a pre-existing script command, ensure you remove the old documentation file from `input/en-us/create/commands` as well, so that there are no duplicate xrefs. diff --git a/Invoke-Tests.ps1 b/Invoke-Tests.ps1 index 3ba4e5bb5..d6ce96f03 100644 --- a/Invoke-Tests.ps1 +++ b/Invoke-Tests.ps1 @@ -22,7 +22,11 @@ param( # Indicate to skip packaging all of the tests packages. Useful for running tests after you've performed the tests previously. [switch] - $SkipPackaging + $SkipPackaging, + + # Specific tag(s) of tests to run + [string[]] + $Tag ) $packageRegex = 'chocolatey\.\d.*\.nupkg' @@ -124,11 +128,15 @@ try { } } + if ($Tag) { + $PesterConfiguration.Filter.Tag = $Tag + } + Invoke-Pester -Configuration $PesterConfiguration } finally { # For some reason we need to import this again... I'm not 100% sure on why... - Import-Module $TestPath/Chocolatey/tools/ChocolateyInstall/helpers/chocolateyInstaller.psm1 + Import-Module $TestPath/Chocolatey/tools/ChocolateyInstall/helpers/chocolateyInstaller.psm1 -Force # Put back Path and Chocolatey Set-EnvironmentVariable -Name 'PATH' -Scope 'User' -Value $environmentVariables.UserPath Set-EnvironmentVariable -Name 'ChocolateyInstall' -Scope 'User' -Value $environmentVariables.UserChocolateyInstall diff --git a/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 b/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 index f47db73b1..da3b3f6df 100644 --- a/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 +++ b/nuspec/chocolatey/chocolatey/tools/chocolateysetup.psm1 @@ -463,8 +463,21 @@ function Install-ChocolateyFiles { Get-ChildItem -Path "$_" | ForEach-Object { #Write-Debug "Checking child path $_ ($($_.FullName))" if (Test-Path $_.FullName) { - Write-Debug "Removing $_ unless matches .log" - Remove-Item $_.FullName -Exclude *.log -Recurse -Force -ErrorAction SilentlyContinue + # If this is an upgrade, we can't *delete* Chocolatey.PowerShell.dll, as it will be currently loaded and thus locked. + # Instead, rename it with a .old suffix. The code in the installer module will delete the .old file next time it runs. + # This works similarly to how we move rather than overwriting choco.exe itself. + if ($_.Name -ne "Chocolatey.PowerShell.dll") { + Write-Debug "Removing $_ unless matches .log" + Remove-Item $_.FullName -Exclude *.log -Recurse -Force -ErrorAction SilentlyContinue + } + else { + $oldPath = "$($_.FullName).old" + Write-Debug "Moving $_ to $oldPath" + + # Remove any still-existing Chocolatey.PowerShell.dll.old files before moving/renaming the current one. + Get-Item -Path $oldPath -ErrorAction SilentlyContinue | Remove-Item -Force + Move-Item $_.Fullname -Destination $oldPath + } } } } diff --git a/nuspec/nuget/Chocolatey.PowerShell/Chocolatey.PowerShell.nuspec b/nuspec/nuget/Chocolatey.PowerShell/Chocolatey.PowerShell.nuspec new file mode 100644 index 000000000..af6167d52 --- /dev/null +++ b/nuspec/nuget/Chocolatey.PowerShell/Chocolatey.PowerShell.nuspec @@ -0,0 +1,33 @@ + + + + Chocolatey.PowerShell + 0.9.9 + Chocolatey Software, Inc + Chocolatey CLI PowerShell Helpers + Chocolatey Software, Inc + https://github.com/chocolatey/choco + https://chocolatey.org/assets/images/nupkg/chocolateyicon.png + https://raw.githubusercontent.com/chocolatey/choco/master/LICENSE + false + 2024 Chocolatey Software, Inc + chocolatey powershell + Chocolatey CLI's PowerShell helper commands + +Chocolatey is a package manager for Windows (like apt-get but for Windows). + +This is the Chocolatey PowerShell Library (API / DLL) package which contains the PowerShell helper commands used in Chocolatey CLI itself. + +### Information + +- [Chocolatey Website and Community Package Repository](https://community.chocolatey.org) +- [Mailing List](http://groups.google.com/group/chocolatey) / [Release Announcements Only Mailing List](https://groups.google.com/group/chocolatey-announce) / [Build Status Mailing List](http://groups.google.com/group/chocolatey-build-status) +- [Twitter](https://twitter.com/chocolateynuget) / [Facebook](https://www.facebook.com/ChocolateySoftware) / [GitHub](https://github.com/chocolatey) +- [Blog](https://blog.chocolatey.org/) / [Newsletter](https://chocolatey.us8.list-manage1.com/subscribe?u=86a6d80146a0da7f2223712e4&id=73b018498d) +- [Documentation](https://docs.chocolatey.org/en-us/) / [Support](https://chocolatey.org/support) + + +See all - https://docs.chocolatey.org/en-us/choco/release-notes + + + diff --git a/recipe.cake b/recipe.cake index dda5937fe..ed259dc94 100644 --- a/recipe.cake +++ b/recipe.cake @@ -15,7 +15,8 @@ Func> getILMergeConfigs = () => var targetPlatform = "v4,C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8"; var assembliesToILMerge = GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco/*.{exe|dll}") - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco/choco.exe") - - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco/System.Management.Automation.dll"); + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco/System.Management.Automation.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco/Chocolatey.PowerShell.dll"); Information("The following assemblies have been selected to be ILMerged for choco.exe..."); foreach (var assemblyToILMerge in assembliesToILMerge) @@ -34,10 +35,11 @@ Func> getILMergeConfigs = () => AssemblyPaths = assembliesToILMerge }); assembliesToILMerge = GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/*.{exe|dll}") - - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/choco.exe") - - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/chocolatey.dll") - - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/log4net.dll") - - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/System.Management.Automation.dll"); + - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/choco.exe") + - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/chocolatey.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/log4net.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/System.Management.Automation.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedLibraries + "/chocolatey/Chocolatey.PowerShell.dll"); Information("The following assemblies have been selected to be ILMerged for chocolatey.dll..."); foreach (var assemblyToILMerge in assembliesToILMerge) @@ -58,10 +60,11 @@ Func> getILMergeConfigs = () => if (DirectoryExists(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/")) { var no7zAssembliesToILMerge = GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/*.{exe|dll}") - - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/choco.exe") - - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/System.Management.Automation.dll") - - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/chocolatey.tests*.dll") - - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/{Moq|nunit|Should|testcentric}*.dll"); + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/choco.exe") + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/System.Management.Automation.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/chocolatey.tests*.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/{Moq|nunit|Should|testcentric}*.dll") + - GetFiles(BuildParameters.Paths.Directories.PublishedApplications + "/choco-no7zip/Chocolatey.PowerShell.dll"); Information("The following assemblies have been selected to be ILMerged for choco.exe No7zip Version..."); foreach (var assemblyToILMerge in no7zAssembliesToILMerge) @@ -121,13 +124,15 @@ Func getFilesToSign = () => var filesToSign = GetFiles(BuildParameters.Paths.Directories.NuGetNuspecDirectory + "/lib/chocolatey.dll") + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/choco.exe") + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/tools/{checksum|shimgen}.exe") - + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/redirects/*.exe"); + + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/redirects/*.exe") + + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll"); if (DirectoryExists(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip")) { filesToSign += GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip/tools/chocolateyInstall/choco.exe") + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip/tools/chocolateyInstall/tools/{checksum|shimgen}.exe") - + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip/tools/chocolateyInstall/redirects/*.exe"); + + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip/tools/chocolateyInstall/redirects/*.exe") + + GetFiles(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "-no7zip/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll"); } Information("The following assemblies have been selected to be signed..."); @@ -172,6 +177,10 @@ Task("Prepare-Chocolatey-Packages") StartProcess(BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/choco.exe", new ProcessSettings{ Arguments = "unpackself -f -y --allow-unofficial-build --run-actual" }); + // Copy Chocolatey.PowerShell.dll and its help.xml file + CopyFile(BuildParameters.Paths.Directories.PublishedLibraries + "/Chocolatey.PowerShell/Chocolatey.PowerShell.dll", BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll"); + CopyFile(BuildParameters.Paths.Directories.PublishedLibraries + "/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-help.xml", BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll-help.xml"); + // Tidy up logs and config folder which are not required var logsDirectory = BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/logs"; var configDirectory = BuildParameters.Paths.Directories.ChocolateyNuspecDirectory + "/tools/chocolateyInstall/config"; @@ -260,6 +269,10 @@ Task("Prepare-ChocolateyNo7zip-Package") StartProcess(nuspecDirectory + "/tools/chocolateyInstall/choco.exe", new ProcessSettings{ Arguments = "unpackself -f -y --allow-unofficial-build" }); + // Copy Chocolatey.PowerShell.dll and help.xml file + CopyFile(BuildParameters.Paths.Directories.PublishedLibraries + "/Chocolatey.PowerShell/Chocolatey.PowerShell.dll", nuspecDirectory + "/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll"); + CopyFile(BuildParameters.Paths.Directories.PublishedLibraries + "/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-help.xml", nuspecDirectory + "/tools/chocolateyInstall/helpers/Chocolatey.PowerShell.dll-help.xml"); + // Tidy up logs and config folder which are not required var logsDirectory = nuspecDirectory + "/tools/chocolateyInstall/logs"; var configDirectory = nuspecDirectory + "/tools/chocolateyInstall/config"; diff --git a/src/Chocolatey.PowerShell/Chocolatey.PowerShell.csproj b/src/Chocolatey.PowerShell/Chocolatey.PowerShell.csproj new file mode 100644 index 000000000..982d5c1a4 --- /dev/null +++ b/src/Chocolatey.PowerShell/Chocolatey.PowerShell.csproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + {88396C46-8089-4814-A7D1-E18777FF6083} + Library + Properties + Chocolatey.PowerShell + Chocolatey.PowerShell + v4.8 + 512 + true + 7.3 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\ReleaseOfficial\ + TRACE;FORCE_CHOCOLATEY_OFFICIAL_KEY + true + true + pdbonly + AnyCPU + prompt + MinimumRecommendedRules.ruleset + false + + + + + + + + + + + + False + ..\..\lib\PowerShell\System.Management.Automation.dll + + + + + + + + + + + + + + + + + + Properties\SolutionVersion.cs + + + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/src/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-Help.xml b/src/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-Help.xml new file mode 100644 index 000000000..b6f74a03d --- /dev/null +++ b/src/Chocolatey.PowerShell/Chocolatey.PowerShell.dll-Help.xml @@ -0,0 +1,936 @@ + + + + + Get-EnvironmentVariable + Get + EnvironmentVariable + + Gets an Environment Variable. + + + + This will will get an environment variable based on the variable name and scope while accounting whether to expand the variable or not (e.g.: `%TEMP%`-> `C:\User\Username\AppData\Local\Temp`). + + + + Get-EnvironmentVariable + + Name + + The environment variable you want to get the value from. + + String + + String + + + None + + + Scope + + The environment variable target scope. This is `Process`, `User`, or `Machine`. + + + Process + User + Machine + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + PreserveVariables + + Whether you want to expand embedded environment variable names or not. When not set, variables will be expanded. + + + SwitchParameter + + + False + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + Name + + The environment variable you want to get the value from. + + String + + String + + + None + + + PreserveVariables + + Whether you want to expand embedded environment variable names or not. When not set, variables will be expanded. + + SwitchParameter + + SwitchParameter + + + False + + + Scope + + The environment variable target scope. This is `Process`, `User`, or `Machine`. + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + + + + + System.String + + + Outputs the value of the target environment variable as a string. + + + + + + This helper reduces the number of lines one would have to write to get environment variables, mainly when not expanding the variables is a must. + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Get-EnvironmentVariable -Name 'TEMP' -Scope User -PreserveVariables + + Gets the `TEMP` encironment variable from the user scope, without expanding embedded environment variables. + + + + -------------------------- Example 2 -------------------------- + PS C:\> Get-EnvironmentVariable -Name 'PATH' -Scope Machine + + Gets the `PATH` environment variable from the machine scope, expanding embedded environment variables. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/get-environmentvariable + + + Get-EnvironmentVariableNames + xref:get-environmentvariablenames + + + Set-EnvironmentVariable + xref:set-environmentvariable + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Get-EnvironmentVariableNames + Get + EnvironmentVariableNames + + Gets all environment variable names. + + + + Provides a list of environment variable names based on the scope. This can be used to loop through the list and generate names. + + + + Get-EnvironmentVariableNames + + Scope + + The environment variable target scope. This is `Process`, `User`, or `Machine`. + + + Process + User + Machine + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + Scope + + The environment variable target scope. This is `Process`, `User`, or `Machine`. + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + + + + + System.String + + + Outputs the names of all the environment variables in the target scope as strings. + + + + + + Process dumps the current environment variable names in memory / session. The other scopes refer to the registry values. + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Get-EnvironmentVariableNames -Scope Machine + + Outputs the names of all the environment variables defined in the registry for the Machine scope. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/get-environmentvariablenames + + + Get-EnvironmentVariable + xref:get-environmentvariable + + + Set-EnvironmentVariable + xref:set-environmentvariable + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Install-ChocolateyPath + Install + ChocolateyPath + + > :choco-info: NOTE > > Administrative Access Required when `-PathType 'Machine'.` + This puts a directory to the PATH environment variable. + + + + Looks at both PATH environment variables to ensure a path variable correctly shows up on the right PATH. + + + + Install-ChocolateyPath + + Path + + The full path to a location to add / ensure is in the PATH. + + String + + String + + + None + + + PathType + + Which PATH to add it to. If specifying `Machine`, this requires admin privileges to run correctly. + + + Process + User + Machine + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + Path + + The full path to a location to add / ensure is in the PATH. + + String + + String + + + None + + + PathType + + Which PATH to add it to. If specifying `Machine`, this requires admin privileges to run correctly. + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + + + + + This command will assert UAC/Admin privileges on the machine if `-PathType 'Machine'`. + This is used when the application/tool is not being linked by Chocolatey (not in the lib folder). + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Install-ChocolateyPath -PathToInstall "$($env:SystemDrive)\tools\gittfs" + + Adds the target path to the current user's PATH. + + + + -------------------------- Example 1 -------------------------- + PS C:\> Install-ChocolateyPath "$($env:SystemDrive)\Program Files\MySQL\MySQL Server 5.5\bin" -PathType 'Machine' + + Adds the target path to the system-wide PATH. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/install-chocolateypath + + + Uninstall-ChocolateyPath + xref:uninstall-chocolateypath + + + Install-ChocolateyEnvironmentVariable + xref:install-chocolateyenvironmentvariable + + + Get-EnvironmentVariable + xref:get-environmentvariable + + + Set-EnvironmentVariable + xref:set-environmentvariable + + + Get-ToolsLocation + xref:get-toolslocation + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Set-EnvironmentVariable + Set + EnvironmentVariable + + > :choco-info: NOTE > > Administrative Access Required when `-Scope 'Machine'.` + DO NOT USE. Not part of the public API. Use `Install-ChocolateyEnvironmentVariable` instead. + + + + Saves an environment variable. + + + + Set-EnvironmentVariable + + Name + + The name of the environment variable to set. + + String + + String + + + None + + + Value + + The value to set the named environment variable to. + + String + + String + + + None + + + Scope + + The scope to set the environment variable at. + + + Process + User + Machine + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + Name + + The name of the environment variable to set. + + String + + String + + + None + + + Scope + + The scope to set the environment variable at. + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + Value + + The value to set the named environment variable to. + + String + + String + + + None + + + + + + + This command will assert UAC/Admin privileges on the machine if `-Scope 'Machine'`. + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Set-EnvironmentVariable -Name MyApplicationPath -Value C:\test -Scope Machine + + Sets the `MyApplicationPath` environment variable to `C:\test` at the system level. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/set-environmentvariable + + + Install-ChocolateyEnvironmentVariable + xref:install-chocolateyenvironmentvariable + + + Uninstall-ChocolateyEnvironmentVariable + xref:uninstall-chocolateyenvironmentvariable + + + Install-ChocolateyPath + xref:install-chocolateypath + + + Get-EnvironmentVariable + xref:get-environmentvariable + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Test-ProcessAdminRights + Test + ProcessAdminRights + + Tests whether the current process is running with administrative rights. + + + + This function checks whether the current process has administrative rights by checking if the current user identity is a member of the Administrators group. It returns `$true` if the current process is running with administrative rights, `$false` otherwise. + On Windows Vista and later, with UAC enabled, the returned value represents the actual rights available to the process, for example if it returns `$true`, the process is running elevated. + + + + Test-ProcessAdminRights + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + + System.Boolean + + + Outputs `$true` if the current process has admin rights, otherwise `$false`. + + + + + + + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Test-ProcessAdminRights + + Outputs `$true` if the current process is elevated, otherwise `$false`. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/test-processadminrights + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Uninstall-ChocolateyPath + Uninstall + ChocolateyPath + + > :choco_info: NOTE > > Administrative Access Required when `-PathType 'Machine'.` + This puts a directory to the PATH environment variable. + + + + Ensures that the given path is not present in the given type of PATH environment variable as well as in the current session. + + + + Uninstall-ChocolateyPath + + Path + + The exact path to remove from the environment PATH. + + String + + String + + + None + + + PathType + + Which PATH to add it to. If specifying `Machine`, this requires admin privileges to run correctly. + + + Process + User + Machine + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + Path + + The exact path to remove from the environment PATH. + + String + + String + + + None + + + PathType + + Which PATH to add it to. If specifying `Machine`, this requires admin privileges to run correctly. + + EnvironmentVariableTarget + + EnvironmentVariableTarget + + + None + + + + + + + This command will assert UAC/Admin privileges on the machine if `-PathType 'Machine'`. This is used when the application/tool is not being linked by Chocolatey (not in the lib folder). + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Uninstall-ChocolateyPath -PathToUninstall "$($env:SystemDrive)\tools\gittfs" + + Removes the target path from the current user's PATH environment variable. + + + + -------------------------- Example 2 -------------------------- + PS C:\> Uninstall-ChocolateyPath "$($env:SystemDrive)\Program Files\MySQL\MySQL Server 5.5\bin" -PathType 'Machine' + + Removes the target path from the system-wide PATH environment variable. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/uninstall-chocolateypath + + + Install-ChocolateyPath + xref:install-chocolateypath + + + Install-ChocolateyEnvironmentVariable + xref:install-chocolateyenvironmentvariable + + + Get-EnvironmentVariable + xref:get-environmentvariable + + + Set-EnvironmentVariable + xref:set-environmentvariable + + + Get-ToolsLocation + xref:get-toolslocation + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + + + Update-SessionEnvironment + Update + SessionEnvironment + + Updates the environment variables of the current powershell session with any environment variable changes that may have occurred during a Chocolatey package install. + + + + When Chocolatey installs a package, the package author may add or change certain environment variables that will affect how the application runs or how it is accessed. Often, these changes are not visible to the current PowerShell session. This means the user needs to open a new PowerShell session before these settings take effect which can render the installed application nonfunctional until that time. + Use the Update-SessionEnvironment command to refresh the current PowerShell session with all environment settings possibly performed by Chocolatey package installs. + + + + Update-SessionEnvironment + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + IgnoredArguments + + Allows splatting with arguments that do not apply. Do not use directly. + + Object[] + + Object[] + + + None + + + + + + + This method is also added to the user's PowerShell profile as `refreshenv`. When called as `refreshenv`, the method will provide additional output. + Preserves `PSModulePath` as set by the process. + + + + + -------------------------- Example 1 -------------------------- + PS C:\> Update-SessionEnvironment + + Updates the current session environment variables. + + + + + + Online Version: + https://docs.chocolatey.org/en-us/create/functions/update-sessionenvironment + + + Cmdlet Reference + xref:powershell-cmdlet-reference + + + Function Reference + xref:powershell-reference + + + + \ No newline at end of file diff --git a/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableCommand.cs b/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableCommand.cs new file mode 100644 index 000000000..9e25124fb --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableCommand.cs @@ -0,0 +1,50 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsCommon.Get, "EnvironmentVariable")] + [OutputType(typeof(string))] + public sealed class GetEnvironmentVariableCommand : ChocolateyCmdlet + { + [Parameter(Mandatory = true, Position = 0)] + public string Name { get; set; } + + [Parameter(Mandatory = true, Position = 1)] + public EnvironmentVariableTarget Scope { get; set; } + + [Parameter] + public SwitchParameter PreserveVariables { get; set; } + + // Avoid logging environment variable names by accident. + protected override bool Logging { get; } = false; + + protected override void End() + { + if (PreserveVariables) + { + WriteVerbose("Choosing not to expand environment names"); + } + + WriteObject(EnvironmentHelper.GetVariable(this, Name, Scope, PreserveVariables)); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableNamesCommand.cs b/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableNamesCommand.cs new file mode 100644 index 000000000..c46600180 --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/GetEnvironmentVariableNamesCommand.cs @@ -0,0 +1,40 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsCommon.Get, "EnvironmentVariableNames")] + [OutputType(typeof(string))] + public class GetEnvironmentVariableNamesCommand : ChocolateyCmdlet + { + [Parameter(Position = 0)] + public EnvironmentVariableTarget Scope { get; set; } + + // Do not log function call + protected override bool Logging { get; } = false; + + + protected override void End() + { + WriteObject(EnvironmentHelper.GetVariableNames(Scope)); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/InstallChocolateyPathCommand.cs b/src/Chocolatey.PowerShell/Commands/InstallChocolateyPathCommand.cs new file mode 100644 index 000000000..c9da5edd3 --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/InstallChocolateyPathCommand.cs @@ -0,0 +1,41 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsLifecycle.Install, "ChocolateyPath")] + [OutputType(typeof(void))] + public class InstallChocolateyPathCommand : ChocolateyCmdlet + { + [Parameter(Mandatory = true, Position = 0)] + [Alias("PathToInstall")] + public string Path { get; set; } + + [Parameter(Position = 1)] + [Alias("Scope", "Type")] + public EnvironmentVariableTarget PathType { get; set; } = EnvironmentVariableTarget.User; + + protected override void End() + { + Paths.InstallPathEntry(this, Path, PathType); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/SetEnvironmentVariableCommand.cs b/src/Chocolatey.PowerShell/Commands/SetEnvironmentVariableCommand.cs new file mode 100644 index 000000000..a73c996aa --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/SetEnvironmentVariableCommand.cs @@ -0,0 +1,42 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsCommon.Set, "EnvironmentVariable")] + [OutputType(typeof(void))] + public sealed class SetEnvironmentVariableCommand : ChocolateyCmdlet + { + [Parameter(Mandatory = true, Position = 0)] + public string Name { get; set; } + + [Parameter(Position = 1)] + public string Value { get; set; } = string.Empty; + + [Parameter(Position = 2)] + public EnvironmentVariableTarget Scope { get; set; } + + protected override void End() + { + EnvironmentHelper.SetVariable(this, Name, Scope, Value); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/TestProcessAdminRightsCommand.cs b/src/Chocolatey.PowerShell/Commands/TestProcessAdminRightsCommand.cs new file mode 100644 index 000000000..276569713 --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/TestProcessAdminRightsCommand.cs @@ -0,0 +1,36 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsDiagnostic.Test, "ProcessAdminRights")] + [OutputType(typeof(bool))] + public sealed class TestProcessAdminRightsCommand : ChocolateyCmdlet + { + protected override void Process() + { + var isAdmin = ProcessInformation.IsElevated(); + + WriteDebug($"Test-ProcessAdminRights: returning {isAdmin}"); + + WriteObject(isAdmin); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/UninstallChocolateyPathCommand.cs b/src/Chocolatey.PowerShell/Commands/UninstallChocolateyPathCommand.cs new file mode 100644 index 000000000..92faf6a82 --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/UninstallChocolateyPathCommand.cs @@ -0,0 +1,41 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsLifecycle.Uninstall, "ChocolateyPath")] + [OutputType(typeof(void))] + public class UninstallChocolateyPathCommand : ChocolateyCmdlet + { + [Parameter(Mandatory = true, Position = 0)] + [Alias("PathToUninstall")] + public string Path { get; set; } + + [Parameter(Position = 1)] + [Alias("Scope", "Type")] + public EnvironmentVariableTarget PathType { get; set; } = EnvironmentVariableTarget.User; + + protected override void End() + { + Paths.UninstallPathEntry(this, Path, PathType); + } + } +} diff --git a/src/Chocolatey.PowerShell/Commands/UpdateSessionEnvironmentCommand.cs b/src/Chocolatey.PowerShell/Commands/UpdateSessionEnvironmentCommand.cs new file mode 100644 index 000000000..65c32d514 --- /dev/null +++ b/src/Chocolatey.PowerShell/Commands/UpdateSessionEnvironmentCommand.cs @@ -0,0 +1,48 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Management.Automation; +using Chocolatey.PowerShell.Helpers; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Commands +{ + [Cmdlet(VerbsData.Update, "SessionEnvironment")] + [OutputType(typeof(void))] + public sealed class UpdateSessionEnvironmentCommand : ChocolateyCmdlet + { + protected override void End() + { + var calledByAlias = MyInvocation?.InvocationName.ToLower() == "refreshenv"; + + if (calledByAlias) + { + WriteObject("Refreshing environment variables from the registry for powershell.exe. Please wait..."); + } + else + { + WriteVerbose("Refreshing environment variables from the registry."); + } + + EnvironmentHelper.UpdateSession(this); + + if (calledByAlias) + { + WriteObject("Finished"); + } + } + } +} diff --git a/src/Chocolatey.PowerShell/Helpers/Elevation.cs b/src/Chocolatey.PowerShell/Helpers/Elevation.cs new file mode 100644 index 000000000..a8fc6cb8b --- /dev/null +++ b/src/Chocolatey.PowerShell/Helpers/Elevation.cs @@ -0,0 +1,75 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Management.Automation; + +namespace Chocolatey.PowerShell.Helpers +{ + /// + /// Helpers for checking and handling if the process is elevated or not. + /// + public static class Elevation + { + /// + /// Ensures a command is run in an elevated context. + /// + /// The return type of the . + /// The cmdlet calling the method. + /// The C# code path that is typically executed if the process is elevated. + /// The PowerShell fallback command that will re-enter the code path after elevation. + /// The return value of the or the when executed. + public static object RunElevated(PSCmdlet cmdlet, Func action, string fallbackCommand) + { + if (ProcessInformation.IsElevated()) + { + return action(); + } + + // We're going to quote the string in order to pass it to the command, + // so escape any double quotes passed in with PowerShell escape chars + // to ensure they're passed in correctly. + if (fallbackCommand.IndexOf('"') != -1) + { + fallbackCommand.Replace("\"", "`\""); + } + + // This elevation path is known not to work, because this command does *not* invoke the new process with + // BOTH UseShellExecute=true and Verb=RunAs (see https://github.com/chocolatey/choco/issues/434). + // This code remains here to mimic the current elevation checks used for the other code path, and is + // expected to be removed or completely overhaulted and replaced in the near-ish future. + return cmdlet.InvokeCommand.InvokeScript($"Start-ChocolateyProcessAsAdmin -statements \"{fallbackCommand}\""); + } + + /// + /// Ensures a command is run in an elevated context. + /// + /// The cmdlet calling the method. + /// The C# code path that is typically executed if the process is elevated. + /// The PowerShell fallback command that will re-enter the code path after elevation. + /// The return value of the or the when executed. + public static void RunElevated(PSCmdlet cmdlet, Action action, string fallbackCommand) + { + object wrappedAction() + { + action(); + return null; + } + + RunElevated(cmdlet, wrappedAction, fallbackCommand); + } + } +} diff --git a/src/Chocolatey.PowerShell/Helpers/EnvironmentHelper.cs b/src/Chocolatey.PowerShell/Helpers/EnvironmentHelper.cs new file mode 100644 index 000000000..468c7bb3b --- /dev/null +++ b/src/Chocolatey.PowerShell/Helpers/EnvironmentHelper.cs @@ -0,0 +1,248 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using Chocolatey.PowerShell.Shared; +using Chocolatey.PowerShell.Win32; +using Microsoft.Win32; + +namespace Chocolatey.PowerShell.Helpers +{ + public static class EnvironmentHelper + { + private const string MachineEnvironmentRegistryKeyName = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"; + private const string UserEnvironmentRegistryKeyName = "Environment"; + + /// + /// Gets the value of the environment variable with the target , expanding environment names that may be present in the value. + /// + /// The cmdlet running the method. + /// The name of the environment variable to retrieve. + /// The scope to look in for the environment variable. + /// The value of the environment variable as a string. + public static string GetVariable(PSCmdlet cmdlet, string name, EnvironmentVariableTarget scope) + { + return GetVariable(cmdlet, name, scope, preserveVariables: false); + } + + /// + /// Gets the value of the environment variable with the target . + /// + /// The cmdlet running the method. + /// The name of the environment variable to retrieve. + /// The scope to look in for the environment variable. + /// Whether to preserve environment variable names in the retrieved value. If false, environment names will be expanded. + /// The value of the environment variable as a string. + public static string GetVariable(PSCmdlet cmdlet, string name, EnvironmentVariableTarget scope, bool preserveVariables) + { + if (scope == EnvironmentVariableTarget.Process) + { + return Environment.GetEnvironmentVariable(name, scope); + } + + var value = string.Empty; + + try + { + using (var registryKey = GetEnvironmentKey(scope)) + { + var options = preserveVariables ? RegistryValueOptions.DoNotExpandEnvironmentNames : RegistryValueOptions.None; + if (!(registryKey is null)) + { + value = (string)registryKey.GetValue(name, string.Empty, options); + } + } + } + catch (Exception error) + { + cmdlet.WriteDebug($"Unable to retrieve the {name} environment variable. Details: {error.Message}"); + } + + if (string.IsNullOrEmpty(value)) + { + value = Environment.GetEnvironmentVariable(name, scope); + } + + return value ?? string.Empty; + } + + /// + /// Gets the registry key associated with the targeted scope of Environment variables. + /// + /// The scope of the environment variables to look up. + /// The registry key associated with the targeted of environment variables. + /// Thrown if is not or . + private static RegistryKey GetEnvironmentKey(EnvironmentVariableTarget scope, bool writable = false) + { + switch (scope) + { + case EnvironmentVariableTarget.User: + return Registry.CurrentUser.OpenSubKey(UserEnvironmentRegistryKeyName, writable); + case EnvironmentVariableTarget.Machine: + return Registry.LocalMachine.OpenSubKey(MachineEnvironmentRegistryKeyName, writable); + default: + throw new NotSupportedException($"The environment variable scope value '{scope}' is not supported."); + } + } + + + /// + /// Gets the list of environment variables in the specified . + /// + /// The scope to lookup environment variable names in. + /// + public static string[] GetVariableNames(EnvironmentVariableTarget scope) + { + if (scope == EnvironmentVariableTarget.Process) + { + return Environment.GetEnvironmentVariables().Keys.Cast().ToArray(); + } + + try + { + using (var registryKey = GetEnvironmentKey(scope)) + { + return registryKey.GetValueNames(); + } + } + catch + { + // HKCU:\Environment may not exist in all Windows OSes + return Array.Empty(); + } + } + + /// + /// Sets the value of an environment variable at the target , and updates the current session environment. + /// + /// The cmdlet calling the method. + /// The name of the environment variable to set. + /// The scope to set the environment variable in. + /// The value to set the environment variable to. + public static void SetVariable(PSCmdlet cmdlet, string name, EnvironmentVariableTarget scope, string value) + { + if (scope == EnvironmentVariableTarget.Process) + { + Environment.SetEnvironmentVariable(name, value); + return; + } + + using (var registryKey = GetEnvironmentKey(scope, writable: true)) + { + var registryType = RegistryValueKind.String; + + try + { + if (registryKey.GetValueNames().Contains(name)) + { + registryType = registryKey.GetValueKind(name); + } + } + catch + { + // The value doesn't exist yet, suppress the error. + } + + if (name.ToUpper() == EnvironmentVariables.Path) + { + registryType = RegistryValueKind.ExpandString; + } + + cmdlet.WriteDebug($"Registry type for {name} is/will be {registryType}"); + + registryKey.SetValue(name, value, registryType); + } + + try + { + // Trigger environment refresh in explorer.exe: + // 1. Notify all windows of environment block change + NativeMethods.SendMessageTimeout( + hWnd: (IntPtr)NativeMethods.HWND_BROADCAST, + Msg: NativeMethods.WM_SETTINGCHANGE, + wParam: UIntPtr.Zero, + lParam: "Environment", + fuFlags: 2, + uTimeout: 5000, + out UIntPtr result); + + // 2. Set a user environment variable making the system refresh + var setxPath = string.Format(@"{0}\System32\setx.exe", GetVariable(cmdlet, EnvironmentVariables.SystemRoot, EnvironmentVariableTarget.Process)); + cmdlet.InvokeCommand.InvokeScript($"& \"{setxPath}\" {EnvironmentVariables.ChocolateyLastPathUpdate} \"{DateTime.Now.ToFileTime()}\""); + } + catch (Exception error) + { + cmdlet.WriteWarning($"Failure attempting to let Explorer know about updated environment settings.\n {error.Message}"); + } + + UpdateSession(cmdlet); + } + + /// + /// Updates the current session environment, ensuring environment changes are reflected in the current session. + /// + /// The cmdlet calling the method. + public static void UpdateSession(PSCmdlet cmdlet) + { + var userName = GetVariable(cmdlet, EnvironmentVariables.Username, EnvironmentVariableTarget.Process); + var architecture = GetVariable(cmdlet, EnvironmentVariables.ProcessorArchitecture, EnvironmentVariableTarget.Process); + var psModulePath = GetVariable(cmdlet, EnvironmentVariables.PSModulePath, EnvironmentVariableTarget.Process); + + var scopeList = new List() { EnvironmentVariableTarget.Process, EnvironmentVariableTarget.Machine }; + + var computerName = GetVariable(cmdlet, EnvironmentVariables.ComputerName, EnvironmentVariableTarget.Process); + + // User scope should override (be checked after) machine scope, but only if we're not running as SYSTEM + if (userName != computerName && userName != EnvironmentVariables.System) + { + scopeList.Add(EnvironmentVariableTarget.User); + } + + foreach (var scope in scopeList) + { + foreach (var name in GetVariableNames(scope)) + { + var value = GetVariable(cmdlet, name, scope); + SetVariable(cmdlet, name, EnvironmentVariableTarget.Process, value); + } + } + + // Update PATH, combining both scopes' values. + var paths = new string[2]; + paths[0] = GetVariable(cmdlet, EnvironmentVariables.Path, EnvironmentVariableTarget.Machine); + paths[1] = GetVariable(cmdlet, EnvironmentVariables.Path, EnvironmentVariableTarget.User); + + SetVariable(cmdlet, EnvironmentVariables.Path, EnvironmentVariableTarget.Process, string.Join(";", paths)); + + // Preserve PSModulePath as it's almost always updated by process, preserve it + SetVariable(cmdlet, EnvironmentVariables.PSModulePath, EnvironmentVariableTarget.Process, psModulePath); + + // Preserve user and architecture + if (!string.IsNullOrEmpty(userName)) + { + SetVariable(cmdlet, EnvironmentVariables.Username, EnvironmentVariableTarget.Process, userName); + } + + if (!string.IsNullOrEmpty(architecture)) + { + SetVariable(cmdlet, EnvironmentVariables.ProcessorArchitecture, EnvironmentVariableTarget.Process, architecture); + } + } + } +} diff --git a/src/Chocolatey.PowerShell/Helpers/PSHelper.cs b/src/Chocolatey.PowerShell/Helpers/PSHelper.cs new file mode 100644 index 000000000..a18bca9fc --- /dev/null +++ b/src/Chocolatey.PowerShell/Helpers/PSHelper.cs @@ -0,0 +1,53 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Management.Automation; + +namespace Chocolatey.PowerShell.Helpers +{ + /// + /// Helper methods for cmdlets to make interfacing with PowerShell easier. + /// + public static class PSHelper + { + /// + /// Writes objects to the output pipeline of the , enumerating collections. + /// + /// The cmdlet calling the method. + /// + public static void WriteObject(PSCmdlet cmdlet, object output) + { + cmdlet.WriteObject(output, enumerateCollection: true); + } + + /// + /// Helper method to mimic Write-Host from C#, falls back to Write-Verbose when a host is not available. + /// + /// The cmdlet calling the method. + /// The message to write to the host. + public static void WriteHost(PSCmdlet cmdlet, string message) + { + if (!(cmdlet.Host is null)) + { + cmdlet.Host.UI.WriteLine(message); + } + else + { + cmdlet.WriteVerbose(message); + } + } + } +} diff --git a/src/Chocolatey.PowerShell/Helpers/Paths.cs b/src/Chocolatey.PowerShell/Helpers/Paths.cs new file mode 100644 index 000000000..d1e58f02f --- /dev/null +++ b/src/Chocolatey.PowerShell/Helpers/Paths.cs @@ -0,0 +1,166 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Management.Automation; +using System.Text; +using System.Text.RegularExpressions; +using Chocolatey.PowerShell.Shared; + +namespace Chocolatey.PowerShell.Helpers +{ + internal static class Paths + { + private const string PathSplitPattern = "(?<=\\G(?:[^;\"]|\"[^\"]*\")*);"; + + private static readonly Regex _pathSplitRegex = new Regex(PathSplitPattern, RegexOptions.Compiled); + + /// + /// Split the given at each semicolon, excepting if the semicolon is in double quotes. + /// Blank entries are preserved, such as those caused by a trailing semicolon. + /// + /// A PATH string to parse and split into a list of entries. + /// The list of entries, with any surrounding quotes trimmed from each entry. + internal static string[] ParsePathString(string pathString) + { + var pathList = _pathSplitRegex.Split(pathString ?? string.Empty); + + // Strip any quotes from the PATH entries, if present + for (var i = 0; i < pathList.Length; i++) + { + var entry = pathList[i]; + if (entry.Length >= 2 && entry.StartsWith("\"", StringComparison.Ordinal) && entry.EndsWith("\"", StringComparison.Ordinal)) + { + pathList[i] = entry.Substring(1, entry.Length - 2); + } + } + + return pathList; + } + + /// + /// Case-insensitively find the index of the given in the list of . + /// + /// The list of paths to look in. + /// The value to search for. + /// + internal static int FindPathIndex(List paths, string value) + { + // Ensure we trim any trailing directory separators (slashes) off the end of both the input value to find and the values to compare against. + var valueWithoutTrailingSlash = value.TrimEnd(Path.DirectorySeparatorChar); + + return paths.FindIndex(s => s.TrimEnd(Path.DirectorySeparatorChar).Equals(valueWithoutTrailingSlash, StringComparison.OrdinalIgnoreCase)); + } + + /// + /// Construct a PATH string from a list of entries and add quotes around any entries that contain PATH-reserved characters (; on Windows). + /// + /// The list of paths to format. + /// A correctly-formatted PATH string containing all the input paths, each quoted if necessary. + internal static string GetPathString(IList paths) + { + var result = new StringBuilder(); + + // Quote paths if necessary + for (var i = 0; i < paths.Count; i++) + { + if (result.Length > 0) + { + result.Append(Path.PathSeparator); + } + + var path = paths[i]; + if (path?.IndexOf(Path.PathSeparator) > -1 && !path.StartsWith("\"") && !path.EndsWith("\"")) + { + result.Append($"\"{path}\""); + } + else + { + result.Append(path); + } + } + + return result.ToString(); + } + + /// + /// Installs/adds a new PATH entry at the target . + /// + /// The cmdlet running the method. + /// The path entry to add/install. + /// The target scope of the PATH variable to modify. + public static void InstallPathEntry(PSCmdlet cmdlet, string pathEntry, EnvironmentVariableTarget scope) + { + var pathEntries = new List(ParsePathString(EnvironmentHelper.GetVariable(cmdlet, EnvironmentVariables.Path, scope, preserveVariables: true))); + if (FindPathIndex(pathEntries, pathEntry) == -1) + { + PSHelper.WriteHost(cmdlet, $"PATH environment variable does not have {pathEntry} in it. Adding..."); + + pathEntries.Add(pathEntry); + var newPath = GetPathString(pathEntries); + + void updatePath() + { + EnvironmentHelper.SetVariable(cmdlet, EnvironmentVariables.Path, scope, newPath); + } + + if (scope == EnvironmentVariableTarget.Machine) + { + Elevation.RunElevated(cmdlet, updatePath, $"Install-ChocolateyPath -PathToInstall '{pathEntry}' -PathType {scope}"); + } + else + { + updatePath(); + } + } + } + + /// + /// Uninstalls/removes a PATH entry at the target . + /// + /// The cmdlet running the method. + /// The path entry to remove/uninstall. + /// The target scope of the PATH variable to modify. + public static void UninstallPathEntry(PSCmdlet cmdlet, string pathEntry, EnvironmentVariableTarget scope) + { + var pathEntries = new List(ParsePathString(EnvironmentHelper.GetVariable(cmdlet, EnvironmentVariables.Path, scope, preserveVariables: true))); + var removeIndex = FindPathIndex(pathEntries, pathEntry); + if (removeIndex >= 0) + { + PSHelper.WriteHost(cmdlet, $"Found {pathEntry} in PATH environment variable. Removing..."); + + pathEntries.RemoveAt(removeIndex); + var newPath = GetPathString(pathEntries); + + void updatePath() + { + EnvironmentHelper.SetVariable(cmdlet, EnvironmentVariables.Path, scope, newPath); + } + + if (scope == EnvironmentVariableTarget.Machine) + { + Elevation.RunElevated(cmdlet, updatePath, $"Uninstall-ChocolateyPath -PathToInstall '{pathEntry}' -PathType {scope}"); + } + else + { + updatePath(); + } + } + } + } +} diff --git a/src/Chocolatey.PowerShell/Helpers/ProcessInformation.cs b/src/Chocolatey.PowerShell/Helpers/ProcessInformation.cs new file mode 100644 index 000000000..1237742ab --- /dev/null +++ b/src/Chocolatey.PowerShell/Helpers/ProcessInformation.cs @@ -0,0 +1,57 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Runtime.InteropServices; +using System.Security.Principal; + +namespace Chocolatey.PowerShell.Helpers +{ + public static class ProcessInformation + { + /// + /// Helper method for determining current OS platform. + /// + /// True if the current OS is Windows. + public static bool IsWindows() + { + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + } + + /// + /// Determines whether the current process has administrative rights. + /// + /// True if running on Windows and the process has administrative rights. + public static bool IsElevated() + { + if (!IsWindows()) + { + return false; + } + + using (var identity = WindowsIdentity.GetCurrent(TokenAccessLevels.Query | TokenAccessLevels.Duplicate)) + { + if (identity is null) + { + return false; + } + + var principal = new WindowsPrincipal(identity); + + return principal.IsInRole(WindowsBuiltInRole.Administrator); + } + } + } +} diff --git a/src/Chocolatey.PowerShell/Properties/AssemblyInfo.cs b/src/Chocolatey.PowerShell/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..7e2f53a35 --- /dev/null +++ b/src/Chocolatey.PowerShell/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Runtime.InteropServices; + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("88396c46-8089-4814-a7d1-e18777ff6083")] \ No newline at end of file diff --git a/src/Chocolatey.PowerShell/Shared/ChocolateyCmdlet.cs b/src/Chocolatey.PowerShell/Shared/ChocolateyCmdlet.cs new file mode 100644 index 000000000..458975cb8 --- /dev/null +++ b/src/Chocolatey.PowerShell/Shared/ChocolateyCmdlet.cs @@ -0,0 +1,141 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Collections; +using System.Management.Automation; +using System.Text; +using Chocolatey.PowerShell.Helpers; + +namespace Chocolatey.PowerShell.Shared +{ + /// + /// Base class for all Chocolatey cmdlets. + /// Contains a number of helpers and common code that is used by all cmdlets. + /// + public abstract class ChocolateyCmdlet : PSCmdlet + { + /// + /// For compatibility reasons, we always add the -IgnoredArguments parameter, so that newly added parameters + /// won't break things too much if a package is run with an older version of Chocolatey. + /// + [Parameter(ValueFromRemainingArguments = true)] + public object[] IgnoredArguments { get; set; } + + /// + /// Sets whether the cmdlet writes its parameters and name to the debug log when it is called and + /// when it completes its operation (after End() is called). + /// This should remain set to true for all commands that are considered part of the public Chocolatey CLI API, + /// unless there are concerns about potentially sensitive information making it into a log file from the parameters of the command. + /// + protected virtual bool Logging { get; } = true; + + protected sealed override void BeginProcessing() + { + WriteCmdletCallDebugMessage(); + Begin(); + } + + /// + /// Override this method to define the cmdlet's begin {} block behaviour. + /// Note that parameters that are defined as ValueFromPipeline or ValueFromPipelineByPropertyName + /// will not be available for the duration of this method. + /// + protected virtual void Begin() + { + } + + protected sealed override void ProcessRecord() + { + Process(); + } + + /// + /// Override this method to define the cmdlet's process {} block behaviour. + /// This is called once for every item the cmdlet receives to a pipeline parameter, or only once if the value is supplied directly. + /// Parameters that are defined as ValueFromPipeline or ValueFromPipelineByPropertyName will be available during this method call. + /// + protected virtual void Process() + { + } + + protected sealed override void EndProcessing() + { + End(); + WriteCmdletCompletionDebugMessage(); + } + + /// + /// Override this method to define the cmdlet's end {} block behaviour. + /// Note that parameters that are defined as ValueFromPipeline or ValueFromPipelineByPropertyName + /// may not be available or have complete data during this method call. + /// + protected virtual void End() + { + } + + protected void WriteHost(string message) + { + PSHelper.WriteHost(this, message); + } + + protected new void WriteObject(object value) + { + PSHelper.WriteObject(this, value); + } + + protected void WriteCmdletCallDebugMessage() + { + if (!Logging) + { + return; + } + + var logMessage = new StringBuilder() + .Append("Running ") + .Append(MyInvocation.InvocationName); + + foreach (var param in MyInvocation.BoundParameters) + { + var paramNameLower = param.Key.ToLower(); + + if (paramNameLower == "ignoredarguments") + { + continue; + } + + var paramValue = paramNameLower == "sensitivestatements" || paramNameLower == "password" + ? "[REDACTED]" + : param.Value is IList list + ? string.Join(" ", list) + : LanguagePrimitives.ConvertTo(param.Value, typeof(string)); + + logMessage.Append($" -{param.Key} '{paramValue}'"); + } + + WriteDebug(logMessage.ToString()); + } + + protected void WriteCmdletCompletionDebugMessage() + { + if (!Logging) + { + return; + } + + WriteDebug($"Finishing '{MyInvocation.InvocationName}'"); + } + } +} diff --git a/src/Chocolatey.PowerShell/Shared/EnvironmentVariables.cs b/src/Chocolatey.PowerShell/Shared/EnvironmentVariables.cs new file mode 100644 index 000000000..117478640 --- /dev/null +++ b/src/Chocolatey.PowerShell/Shared/EnvironmentVariables.cs @@ -0,0 +1,30 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +namespace Chocolatey.PowerShell.Shared +{ + public static class EnvironmentVariables + { + public const string ChocolateyLastPathUpdate = "ChocolateyLastPathUpdate"; + public const string ComputerName = "COMPUTERNAME"; + public const string Path = "PATH"; + public const string ProcessorArchitecture = "PROCESSOR_ARCHITECTURE"; + public const string PSModulePath = "PSModulePath"; + public const string System = "SYSTEM"; + public const string SystemRoot = "SystemRoot"; + public const string Username = "USERNAME"; + } +} diff --git a/src/Chocolatey.PowerShell/Win32/NativeMethods.cs b/src/Chocolatey.PowerShell/Win32/NativeMethods.cs new file mode 100644 index 000000000..0f2c0eb54 --- /dev/null +++ b/src/Chocolatey.PowerShell/Win32/NativeMethods.cs @@ -0,0 +1,35 @@ +// Copyright © 2017 - 2024 Chocolatey Software, Inc +// Copyright © 2011 - 2017 RealDimensions Software, LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Runtime.InteropServices; + +namespace Chocolatey.PowerShell.Win32 +{ + internal static class NativeMethods + { + internal const int HWND_BROADCAST = 0xffff; + internal const int WM_SETTINGCHANGE = 0x1a; + + /// + /// See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessagetimeoutw for documentation. + /// + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + internal static extern IntPtr SendMessageTimeout( + IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, + uint fuFlags, uint uTimeout, out UIntPtr lpdwResult); + } +} diff --git a/src/chocolatey.console/chocolatey.console.csproj b/src/chocolatey.console/chocolatey.console.csproj index 92cfc151e..3da9b0326 100644 --- a/src/chocolatey.console/chocolatey.console.csproj +++ b/src/chocolatey.console/chocolatey.console.csproj @@ -224,6 +224,10 @@ {5563DC61-35FD-4FAB-B331-9AE1FDB23F80} chocolatey + + {88396c46-8089-4814-a7d1-e18777ff6083} + Chocolatey.PowerShell + @@ -238,4 +242,10 @@ --> + + + + + + \ No newline at end of file diff --git a/src/chocolatey.resources/chocolatey.resources.csproj b/src/chocolatey.resources/chocolatey.resources.csproj index 9ac71dba5..207c9f748 100644 --- a/src/chocolatey.resources/chocolatey.resources.csproj +++ b/src/chocolatey.resources/chocolatey.resources.csproj @@ -82,7 +82,6 @@ - @@ -91,7 +90,6 @@ - @@ -108,14 +106,6 @@ - - - - - - - - diff --git a/src/chocolatey.resources/helpers/chocolateyInstaller.psm1 b/src/chocolatey.resources/helpers/chocolateyInstaller.psm1 index 4e863f9f8..bdd2c64ad 100644 --- a/src/chocolatey.resources/helpers/chocolateyInstaller.psm1 +++ b/src/chocolatey.resources/helpers/chocolateyInstaller.psm1 @@ -46,13 +46,46 @@ Get-Item -Path "$helpersPath\functions\*.ps1" | . $_.FullName } +$currentAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies() + +# Import commands from Chocolatey.PowerShell.dll +$chocolateyCmdlets = @{} + +$dllPath = "$helpersPath\Chocolatey.PowerShell.dll" +if (Test-Path $dllPath) { + # Try to import from already-loaded assembly, otherwise fallback to importing from dll + $cmdletsAssembly = $currentAssemblies | + Where-Object { $_.GetName().Name -eq 'Chocolatey.PowerShell' } | + Select-Object -First 1 + + if ($cmdletsAssembly) { + Import-Module $cmdletsAssembly.Location -Force + } + else { + Import-Module $dllPath + } + + # Cache module commands for helping resolve lookups + $chocolateyCmdlets.Default = @( (Get-Module Chocolatey.PowerShell).ExportedCmdlets.Keys ) + + Write-Debug "Cmdlets exported from Chocolatey.PowerShell.dll" + $chocolateyCmdlets.Default | Write-Debug + + # Set aliases for imported cmdlets + Set-Alias refreshenv Update-SessionEnvironment + + # Check for & remove Chocolatey.PowerShell.dll.old left-over from an upgrade/reinstall + $dllOldPath = "$dllPath.old" + if (Test-Path $dllOldPath) { + Remove-Item -Path $dllOldPath -Force -ErrorAction SilentlyContinue + } +} + # Export built-in functions prior to loading extensions so that # extension-specific loading behavior can be used based on built-in # functions. This allows those overrides to be much more deterministic Export-ModuleMember -Function * -Alias * -Cmdlet * -$currentAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies() - # Load community extensions if they exist $extensionsPath = Join-Path $helpersPath -ChildPath '..\extensions' if (Test-Path $extensionsPath) { @@ -68,13 +101,19 @@ if (Test-Path $extensionsPath) { Select-Object -First 1 if ($licensedAssembly) { - # It's already loaded, just import the existing assembly as a module for PowerShell to use - Import-Module $licensedAssembly + # Import-Module -Assembly doesn't work if the parent module is reimported, so force the import by path. + Import-Module $licensedAssembly.Location -Force } else { # Fallback: load the extension DLL from the path directly. Import-Module $licensedExtensionPath } + + # Store commands from licensed module, stripping any 'Cmdlet' suffix from the command name + $chocolateyCmdlets.Licensed = @( (Get-Module chocolatey.licensed).ExportedCmdlets.Keys | ForEach-Object { $_ -replace "Cmdlet$" } ) + + Write-Debug "Cmdlets exported from chocolatey.licensed" + $chocolateyCmdlets.Licensed | Write-Debug } catch { # Only write a warning if the Licensed extension failed to load in some way. @@ -91,6 +130,46 @@ if (Test-Path $extensionsPath) { } } +# Exercise caution and test _thoroughly_ with AND without the licensed extension installed +# when making any changes here. And make sure to update this comment if needed when any +# changes are being made. +# +# This code overrides PowerShell's default command lookup semantics as follows: +# +# 1. If the command being looked up is available in chocolatey.licensed.dll as +# a cmdlet with OR without a "Cmdlet" suffix in its name, resolve to this command. +# (in other words, looking for `Get-ChocolateyThing` will _also_ accept something +# called `Get-ChocolateyThingCmdlet` if it's from the licensed extension) +# 2. If nothing comes back from the licensed extension, then look through the cmdlets +# exported from the Chocolatey.PowerShell.dll module. If we find a match, make sure +# we resolve to this command from the Chocolatey.PowerShell.dll module. +# 3. Finally, if neither of the above find the command being looked up, do nothing and allow +# PowerShell to use its default command lookup semantics. +# +# In effect we ensure that any command calls that match the name of one of our commands +# will resolve to _our_ commands (preferring licensed cmdlets in the case of a name collision), +# preventing packages from overriding them with their own commands and potentially breaking things. +$ExecutionContext.InvokeCommand.PreCommandLookupAction = { + param($command, $eventArgs) + + # Don't run this handler for stuff PowerShell is looking up internally + if ($eventArgs.CommandOrigin -eq 'Runspace') { + $resolvedCommand = if ($command -in $chocolateyCmdlets.Licensed) { + Get-Command "$command*" -Module 'chocolatey.licensed' -CommandType Cmdlet -ErrorAction Ignore | + Where-Object { $_.Name -match "^$command(Cmdlet)?$" } | + Select-Object -First 1 + } + elseif ($command -in $chocolateyCmdlets.Default) { + Get-Command $command -Module "Chocolatey.PowerShell" -CommandType Cmdlet -ErrorAction Ignore + } + + if ($resolvedCommand) { + $eventArgs.Command = $resolvedCommand + $eventArgs.StopSearch = $true + } + } +}.GetNewClosure() + # todo: explore removing this for a future version Export-ModuleMember -Function * -Alias * -Cmdlet * diff --git a/src/chocolatey.resources/helpers/chocolateyProfile.psm1 b/src/chocolatey.resources/helpers/chocolateyProfile.psm1 index 920ee490a..56aab372d 100644 --- a/src/chocolatey.resources/helpers/chocolateyProfile.psm1 +++ b/src/chocolatey.resources/helpers/chocolateyProfile.psm1 @@ -20,10 +20,9 @@ if (Get-Module chocolateyProfile) { $thisDirectory = (Split-Path -Parent $MyInvocation.MyCommand.Definition) +Import-Module "$thisDirectory\Chocolatey.PowerShell.dll" -Cmdlet "Get-EnvironmentVariable", "Get-EnvironmentVariableNames", "Update-SessionEnvironment" + . $thisDirectory\functions\Write-FunctionCallLogMessage.ps1 -. $thisDirectory\functions\Get-EnvironmentVariable.ps1 -. $thisDirectory\functions\Get-EnvironmentVariableNames.ps1 -. $thisDirectory\functions\Update-SessionEnvironment.ps1 . $thisDirectory\ChocolateyTabExpansion.ps1 Export-ModuleMember -Alias refreshenv -Function 'Update-SessionEnvironment', 'TabExpansion' diff --git a/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariable.ps1 b/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariable.ps1 deleted file mode 100644 index 0d893fc30..000000000 --- a/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariable.ps1 +++ /dev/null @@ -1,322 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Get-EnvironmentVariable { - <# -.SYNOPSIS -Gets an Environment Variable. - -.DESCRIPTION -This will will get an environment variable based on the variable name -and scope while accounting whether to expand the variable or not -(e.g.: `%TEMP%`-> `C:\User\Username\AppData\Local\Temp`). - -.NOTES -This helper reduces the number of lines one would have to write to get -environment variables, mainly when not expanding the variables is a -must. - -.PARAMETER Name -The environment variable you want to get the value from. - -.PARAMETER Scope -The environment variable target scope. This is `Process`, `User`, or -`Machine`. - -.PARAMETER PreserveVariables -A switch parameter stating whether you want to expand the variables or -not. Defaults to false. - -.PARAMETER IgnoredArguments -Allows splatting with arguments that do not apply. Do not use directly. - -.EXAMPLE -Get-EnvironmentVariable -Name 'TEMP' -Scope User -PreserveVariables - -.EXAMPLE -Get-EnvironmentVariable -Name 'PATH' -Scope Machine - -.LINK -Get-EnvironmentVariableNames - -.LINK -Set-EnvironmentVariable -#> - [CmdletBinding()] - [OutputType([string])] - param( - [Parameter(Mandatory = $true)][string] $Name, - [Parameter(Mandatory = $true)][System.EnvironmentVariableTarget] $Scope, - [Parameter(Mandatory = $false)][switch] $PreserveVariables = $false, - [parameter(ValueFromRemainingArguments = $true)][Object[]] $ignoredArguments - ) - - # Do not log function call, it may expose variable names - ## Called from chocolateysetup.psm1 - wrap any Write-Host in try/catch - - [string] $MACHINE_ENVIRONMENT_REGISTRY_KEY_NAME = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"; - [Microsoft.Win32.RegistryKey] $win32RegistryKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($MACHINE_ENVIRONMENT_REGISTRY_KEY_NAME) - if ($Scope -eq [System.EnvironmentVariableTarget]::User) { - [string] $USER_ENVIRONMENT_REGISTRY_KEY_NAME = "Environment"; - [Microsoft.Win32.RegistryKey] $win32RegistryKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey($USER_ENVIRONMENT_REGISTRY_KEY_NAME) - } - elseif ($Scope -eq [System.EnvironmentVariableTarget]::Process) { - return [Environment]::GetEnvironmentVariable($Name, $Scope) - } - - [Microsoft.Win32.RegistryValueOptions] $registryValueOptions = [Microsoft.Win32.RegistryValueOptions]::None - - if ($PreserveVariables) { - Write-Verbose "Choosing not to expand environment names" - $registryValueOptions = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames - } - - [string] $environmentVariableValue = [string]::Empty - - try { - #Write-Verbose "Getting environment variable $Name" - if ($win32RegistryKey -ne $null) { - # Some versions of Windows do not have HKCU:\Environment - $environmentVariableValue = $win32RegistryKey.GetValue($Name, [string]::Empty, $registryValueOptions) - } - } - catch { - Write-Debug "Unable to retrieve the $Name environment variable. Details: $_" - } - finally { - if ($win32RegistryKey -ne $null) { - $win32RegistryKey.Close() - } - } - - if ($environmentVariableValue -eq $null -or $environmentVariableValue -eq '') { - $environmentVariableValue = [Environment]::GetEnvironmentVariable($Name, $Scope) - } - - return $environmentVariableValue -} - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB9Qfj9olJseG+H -# BaZcC/4CnnBSGfF/XwAHL3FQVwzI+qCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCC4o2CdEffD6UXLSuHr8qIfXuiSfYHZzcy6u/UKaDVtDzANBgkqhkiG -# 9w0BAQEFAASCAYBOUNKswrsqhuSRVEW6hGSj/EN9EHcu/r2Keol/wmFMwzmEv+I+ -# jJI21q0vNJMRakE4U7HAk01BlQyiZTIcuOxZOVBz6HDEH0X0IfPp32wLglQIJRnx -# NERh6qCffIeJuk2yl//U1bSFIhkaRPb91Fhf0KN9IV+bCSpTOuA44tCf8IkfodL8 -# YLftb0S7Lg6nhIh+K16jcPMP6OupY+WCxLHthU2bjdwHNNAxBFVYrTkWSgFgPekW -# s0L7GuTnWqim/4jXWOFmZgnswUgEt73bO2YlwdfHc97QJQdwYg+NO3erjN2kq2oW -# zKbwPsTJliDDsgDXlTUbEix499RIzcrFE1LuRK8WJuUihgZ4Htt+yaanAz1TSyYY -# DnAnJ5gh4GMRKqm4B+m8x1rYde8rME29d3mJmeWBwixwxqMB3a8OdkiqMd65Ne/g -# WqbQcxirsVFc8Ib0Pm9p3nhLYBONPGK5txZBNKwYyBQAiVvfv8kD84vt2zb+SsHY -# qbcM7ZLvvVJLPxKhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTE5WjAvBgkq -# hkiG9w0BCQQxIgQgDGV7ImUYLZ9Ai2qepcXTMsqSmS7mXhbqYxsi9UCnbCYwDQYJ -# KoZIhvcNAQEBBQAEggIACTHaJOUlpXd4gZzWXtO/dS83Fi8s00Nyyh+pLTEGjrEy -# sczYGbuiE4GmP5M+fzG6S8nz0BVopykiF3YyvuixKhLuvs2CqyFCOEGZJXQBohiM -# CNlcnwcQBmMZrYnZERip6EOjtoieRsiNcPoNVwYdPOBnIgAS7IsXFrckND/MZZpr -# ik2s8u4xhdslPmN2eMMT9epqWHkOFgFZT+qsp+J5thEU+GfjDa8aieMXipcXBUhl -# O+8N0nkDmW9BBv95OyQFxj36xNKz22zoFH5i9pkhGUvqoq8fqwPvTf+hsnWvhBk+ -# L92m9IbBY9+Ia5qOSQMn0uoQjkCGX6rRIsgsbZB9X1EWsaxv7DHsRe0SGOrmKZ1K -# V7NmN7Q7Hg5yh00vLGz+04Go50+4yIizLKyhVnWU6CvzOjO57U0ARpHhnoVr8mNS -# rY/751XraP1E/ZWfEz32+uCWWpnIZm6ZSfsQH1PRuM+gjJNuJDkv/ojg/qxdVhzY -# 29nmpn8Lh//Ldb6nzQBNLu/ebIihOjw8534T06XbOAZKlof3PtWMh+z0xxT5Tk2o -# VOfJermGkGm6AvZPoEhR4dC25Nh7Kki33bgC1yv2//IufGDwfscmYxB97ZzM1hh3 -# FANBx1oaR6n+d1/i/dUwILh052205CSCIt46CSrW/6hFNYO14U+/GlYA6uxqysA= -# SIG # End signature block diff --git a/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariableNames.ps1 b/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariableNames.ps1 deleted file mode 100644 index b5d82cce9..000000000 --- a/src/chocolatey.resources/helpers/functions/Get-EnvironmentVariableNames.ps1 +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Get-EnvironmentVariableNames([System.EnvironmentVariableTarget] $Scope) { - <# -.SYNOPSIS -Gets all environment variable names. - -.DESCRIPTION -Provides a list of environment variable names based on the scope. This -can be used to loop through the list and generate names. - -.NOTES -Process dumps the current environment variable names in memory / -session. The other scopes refer to the registry values. - -.INPUTS -None - -.OUTPUTS -A list of environment variables names. - -.PARAMETER Scope -The environment variable target scope. This is `Process`, `User`, or -`Machine`. - -.EXAMPLE -Get-EnvironmentVariableNames -Scope Machine - -.LINK -Get-EnvironmentVariable - -.LINK -Set-EnvironmentVariable -#> - - # Do not log function call - - # HKCU:\Environment may not exist in all Windows OSes (such as Server Core). - switch ($Scope) { - 'User' { - Get-Item 'HKCU:\Environment' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Property - } - 'Machine' { - Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' | Select-Object -ExpandProperty Property - } - 'Process' { - Get-ChildItem Env:\ | Select-Object -ExpandProperty Key - } - default { - throw "Unsupported environment scope: $Scope" - } - } -} - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAjLpes7qRLZYPU -# k0lAMgbDTUkWmbblbAB93PaWhMVotKCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCC5eZ+RDHBd7mgJjhrR3qvCYyqh2a5SL3oIALleubZHvTANBgkqhkiG -# 9w0BAQEFAASCAYB0ee0ypp1FKnv5+fY0WKhVr7HrDN3kVIqcqrQjjXzPWt0DTmai -# YLRpav+1xHq9lbk8r9fdXfPYMh7XhVC8JQFprTk5iPuk5IVVIs9H39ZJh6joIOI3 -# 7tLtbiBfXbUS1EeIyT2TTRTc35NJOqbs3S+ET6J14G+PDxwlnf7p2RXSkHFZpVcf -# vbehQftKM6jJPmQiZlCOBiki3QHREB3eyg+vxQdqvlB3iyjM7ejb6Wp/oCxc+vYT -# 94KnVz6srbyk8dzdhwy7c5DXdqyhHFoCkZIX6+OFVtFKpG3rnldV80Q29L11tJuM -# crhSnwAD3ALGEGpICwdWqkIk0BeuZHolQbN4AhPsMjuaf3a/jq8mYB8ocGdcazFV -# uvFX8tVawo8HKob+dPxVuywYK2pcLCfcXAVyMJfDxPkIwUSVRn4OdpwVyNZBbl5T -# YoVHCaw6CSahqnU5cUpbBDyMJ2i4eNyuARVu1HB4UcT009sePLELX7QFLJmK+mgp -# nFU8QAgVTLFWGKOhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTIwWjAvBgkq -# hkiG9w0BCQQxIgQgrhn1BZLSDFmdFE6RsKqWlkDO0fnvAviSncT7scvwzkkwDQYJ -# KoZIhvcNAQEBBQAEggIAAZAIgWDWSP+uC7Mf9U8Rhwh/5W3FvXuYGm7M1sc/eX7y -# cN9Wt6eNKpZ91FgGyhqB9zO6ndACsEvPT+AwLHMckYHeS71G/McNyj3NFTbksUVQ -# 86Gw4D5OGnfBhU2VaguLgZpZ0DFpO0J1+w/W4pQG7XBmQiicQxs/Rw0Fb6fhzDLn -# DvB3OtYK+Qv/S8HPgcbTsodgcqIznWoAfFz6brmupkQCgIoe7Yml6aY/FztsixY5 -# NFIuiVimQ2h541ispP0A4aMTSexOMUg3kEa2aG4E/5/0ILARV7n0CFVsq9vjBdKV -# u0E/RFcBKZzA11P4+JBbcAE2YuVm4BRC6TmYSf9sUGB5zx63Eyc7xPMjR1FLWZHU -# JCke+ydQ1pwc9ezPJ97ABY6AiaynLWZdwH3eMF8N4/irSigj6KvNqz37yCoTYKOz -# e76Y9+tab2BvK2WzPTH/Y1kPF82O7L97BaBoyba8WVgIy8rE/kxq3TUIH1nH8gBB -# q/VE0NU95NmxkBSpLjxvIxLvHtxY07p3aneE2ofB30FFC9msqYW0eAqsAWrH8nTu -# 1h6Fx/avSLOvMcJMsUpajNIfv5QWdXZ7qfAwtVWggzBMQ06635EojJKZAJTNFI2x -# 27ZzMMlObcl3k25x8rqEzAhEZxhImtfDu4vrXIbouQO8hJF+SM2yrYOAJmmEbp4= -# SIG # End signature block diff --git a/src/chocolatey.resources/helpers/functions/Install-ChocolateyPath.ps1 b/src/chocolatey.resources/helpers/functions/Install-ChocolateyPath.ps1 deleted file mode 100644 index 1d269893d..000000000 --- a/src/chocolatey.resources/helpers/functions/Install-ChocolateyPath.ps1 +++ /dev/null @@ -1,336 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Install-ChocolateyPath { - <# -.SYNOPSIS -**NOTE:** Administrative Access Required when `-PathType 'Machine'.` - -This puts a directory to the PATH environment variable. - -.DESCRIPTION -Looks at both PATH environment variables to ensure a path variable -correctly shows up on the right PATH. - -.NOTES -This command will assert UAC/Admin privileges on the machine if -`-PathType 'Machine'`. - -This is used when the application/tool is not being linked by Chocolatey -(not in the lib folder). - -.INPUTS -None - -.OUTPUTS -None - -.PARAMETER PathToInstall -The full path to a location to add / ensure is in the PATH. - -.PARAMETER PathType -Which PATH to add it to. If specifying `Machine`, this requires admin -privileges to run correctly. - -.PARAMETER IgnoredArguments -Allows splatting with arguments that do not apply. Do not use directly. - -.EXAMPLE -Install-ChocolateyPath -PathToInstall "$($env:SystemDrive)\tools\gittfs" - -.EXAMPLE -Install-ChocolateyPath "$($env:SystemDrive)\Program Files\MySQL\MySQL Server 5.5\bin" -PathType 'Machine' - -.LINK -Install-ChocolateyEnvironmentVariable - -.LINK -Get-EnvironmentVariable - -.LINK -Set-EnvironmentVariable - -.LINK -Get-ToolsLocation -#> - param( - [parameter(Mandatory = $true, Position = 0)][string] $pathToInstall, - [parameter(Mandatory = $false, Position = 1)][System.EnvironmentVariableTarget] $pathType = [System.EnvironmentVariableTarget]::User, - [parameter(ValueFromRemainingArguments = $true)][Object[]] $ignoredArguments - ) - - Write-FunctionCallLogMessage -Invocation $MyInvocation -Parameters $PSBoundParameters - ## Called from chocolateysetup.psm1 - wrap any Write-Host in try/catch - - $originalPathToInstall = $pathToInstall - - #get the PATH variable - Update-SessionEnvironment - $envPath = $env:PATH - if (!$envPath.ToLower().Contains($pathToInstall.ToLower())) { - try { - Write-Host "PATH environment variable does not have $pathToInstall in it. Adding..." - } - catch { - Write-Verbose "PATH environment variable does not have $pathToInstall in it. Adding..." - } - - $actualPath = Get-EnvironmentVariable -Name 'Path' -Scope $pathType -PreserveVariables - - $statementTerminator = ";" - #does the path end in ';'? - $hasStatementTerminator = $actualPath -ne $null -and $actualPath.EndsWith($statementTerminator) - # if the last digit is not ;, then we are adding it - If (!$hasStatementTerminator -and $actualPath -ne $null) { - $pathToInstall = $statementTerminator + $pathToInstall - } - if (!$pathToInstall.EndsWith($statementTerminator)) { - $pathToInstall = $pathToInstall + $statementTerminator - } - $actualPath = $actualPath + $pathToInstall - - if ($pathType -eq [System.EnvironmentVariableTarget]::Machine) { - if (Test-ProcessAdminRights) { - Set-EnvironmentVariable -Name 'Path' -Value $actualPath -Scope $pathType - } - else { - $psArgs = "Install-ChocolateyPath -pathToInstall `'$originalPathToInstall`' -pathType `'$pathType`'" - Start-ChocolateyProcessAsAdmin "$psArgs" - } - } - else { - Set-EnvironmentVariable -Name 'Path' -Value $actualPath -Scope $pathType - } - - #add it to the local path as well so users will be off and running - $envPSPath = $env:PATH - $env:Path = $envPSPath + $statementTerminator + $pathToInstall - } -} - -# [System.Text.RegularExpressions.Regex]::Match($Path,[System.Text.RegularExpressions.Regex]::Escape('locationtoMatch') + '(?>;)?', '', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase) - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB13/9RBBrszjJO -# Cug4VHdEezFFfFOvHkseTFzWw/UU5KCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCBy2/dISZoysT/2ztjwlFwmOetkD9rzU8/7epmknYwKSDANBgkqhkiG -# 9w0BAQEFAASCAYCrlVvWF2QZsAAYzUm7WhNsMa9nKbMQajyiZlw7RPpXC7M2OXoR -# rbCc6NcdQbpuhW5t6bTrLwwzBC48gXRKu7DjYdsh3tEz4FisKDTNIK84CBVPa7M8 -# QUfgls+JS6eG8Qm0VJfpTis9NO6oZezmw200LVEBbHrolWqMNH8ylCKYx5obwP0/ -# /SowVVZnQ8nbsi9k6Q/8+MkGogyXODkIA0SKtT75DQ83D2Lc7ASkQ/D5dRQCdzB9 -# GCEcIKTlHTTh5pEkGycRv7RV0705t+xFQzpC+HPLVeh19qqDKFLr6+jtkNHSaUYl -# TrMD1ctXltBt3t9KEf7PxABqIjXQti8os9Xb+eAF+OZdLgM6Ngu2yeWVW2BD7aPV -# SoFvxkt1O+wDde+hQi4UB5Dvv3oErFl9+j/fNf+2KyYQxTcjj47oFBwL46o2HVyQ -# R3PswE6zdWPQNDBwrODr/9YU1z3DbITatgayLe3fWLSp6d7nIpmAf/xgfm4hrr7I -# AXFu3VX4TCrEAXWhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTMwWjAvBgkq -# hkiG9w0BCQQxIgQgBnSuvR897rf6XeohgTZC7jnP8XQl7HEprhlMHWjDK8UwDQYJ -# KoZIhvcNAQEBBQAEggIAW7NKNimUJ8VG8k1o/oIo0IEatoOyxlOYTMKG/q6vdDHA -# pFq//uYW5DyknbPY6L40ybjpPQvDp48//Ya5KlGI31cr9lLVYAcEWPOIwBww6c+o -# 5fNc+C+WR8/DDXajKYMS+p+GpG3cMxd/1sBDX4YK9xujgZg3tdjws+KMgIwdcEd/ -# /GElCgYHBcKr3VYcD2g/caxEoZ+ZByWmAhF2pZZQ3ulkvPh4SwYTkzC+J6GFG6Zt -# 5dEkxs6Zut297QwPMDHWiu3nxjjPKRnACdpJ8fG4wk6OhSVu+RhnpDGKXQaC2FrH -# iN6+0HwXaS860tX1gvBEq6lrmwJ23SMCB93qo1kxJiuv/diNQbWJ68WiPuCCNYN1 -# 4lZZkZ7Ygm1gu1a31zZS+0feRuA0GwSUDmMW2PpeAUj8OcuIERKMGp1hNRwPzJj1 -# 1iObC5eR13XUr1Ssk6tYRGdp5zIfDWpb57KaRvjEjd+jic+o5OjYwNJgzE4k46Zq -# UUjWmYEGg9GUsgwk3GpnIB5pwIj6iGJQFAitoz9iRr5kQ3SrJfHlZWLJ9q010s8z -# tQdIDV6MdU7yJIIT/630UBOFI7tVTgT6v+Uszoc3Em4c7mDt2v3u6EFIESAjzvIC -# CeEiBZTEgGkbzcnPPmAIckNDL3j1+ZsHQA1ZlUmD7qUbJc6jbKpGYEjSOf3imN4= -# SIG # End signature block diff --git a/src/chocolatey.resources/helpers/functions/Set-EnvironmentVariable.ps1 b/src/chocolatey.resources/helpers/functions/Set-EnvironmentVariable.ps1 deleted file mode 100644 index 56a89b88e..000000000 --- a/src/chocolatey.resources/helpers/functions/Set-EnvironmentVariable.ps1 +++ /dev/null @@ -1,340 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Set-EnvironmentVariable { - <# -.SYNOPSIS -**NOTE:** Administrative Access Required when `-Scope 'Machine'.` - -DO NOT USE. Not part of the public API. Use -`Install-ChocolateyEnvironmentVariable` instead. - - -.DESCRIPTION -Saves an environment variable. - -.NOTES -This command will assert UAC/Admin privileges on the machine if -`-Scope 'Machine'`. - -.INPUTS -None - -.OUTPUTS -None - -.PARAMETER Name - -.PARAMETER Value - -.PARAMETER IgnoredArguments -Allows splatting with arguments that do not apply. Do not use directly. - -.LINK -Install-ChocolateyEnvironmentVariable - -.LINK -Uninstall-ChocolateyEnvironmentVariable - -.LINK -Install-ChocolateyPath - -.LINK -Get-EnvironmentVariable -#> - param ( - [parameter(Mandatory = $true, Position = 0)][string] $Name, - [parameter(Mandatory = $false, Position = 1)][string] $Value, - [parameter(Mandatory = $false, Position = 2)] - [System.EnvironmentVariableTarget] $Scope, - [parameter(ValueFromRemainingArguments = $true)][Object[]] $ignoredArguments - ) - - Write-FunctionCallLogMessage -Invocation $MyInvocation -Parameters $PSBoundParameters - - if ($Scope -eq [System.EnvironmentVariableTarget]::Process -or $Value -eq $null -or $Value -eq '') { - return [Environment]::SetEnvironmentVariable($Name, $Value, $Scope) - } - - [string]$keyHive = 'HKEY_LOCAL_MACHINE' - [string]$registryKey = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment\" - [Microsoft.Win32.RegistryKey] $win32RegistryKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($registryKey) - if ($Scope -eq [System.EnvironmentVariableTarget]::User) { - $keyHive = 'HKEY_CURRENT_USER' - $registryKey = "Environment" - [Microsoft.Win32.RegistryKey] $win32RegistryKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey($registryKey) - } - - [Microsoft.Win32.RegistryValueKind]$registryType = [Microsoft.Win32.RegistryValueKind]::String - try { - if ($win32RegistryKey.GetValueNames() -contains $Name) { - $registryType = $win32RegistryKey.GetValueKind($Name) - } - } - catch { - # the value doesn't yet exist - # move along, nothing to see here - } - Write-Debug "Registry type for $Name is/will be $registryType" - - if ($Name -eq 'PATH') { - $registryType = [Microsoft.Win32.RegistryValueKind]::ExpandString - } - - [Microsoft.Win32.Registry]::SetValue($keyHive + "\" + $registryKey, $Name, $Value, $registryType) - - try { - # make everything refresh - # because sometimes explorer.exe just doesn't get the message that things were updated. - if (-not ("win32.nativemethods" -as [type])) { - # import sendmessagetimeout from win32 - Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @" -[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] -public static extern IntPtr SendMessageTimeout( - IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, - uint fuFlags, uint uTimeout, out UIntPtr lpdwResult); -"@ - } - - $HWND_BROADCAST = [intptr]0xffff; - $WM_SETTINGCHANGE = 0x1a; - $result = [uintptr]::zero - - # notify all windows of environment block change - [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result) | Out-Null - - # Set a user environment variable making the system refresh - $setx = "$($env:SystemRoot)\System32\setx.exe" - & "$setx" ChocolateyLastPathUpdate `"$((Get-Date).ToFileTime())`" | Out-Null - } - catch { - Write-Warning "Failure attempting to let Explorer know about updated environment settings.`n $($_.Exception.Message)" - } - - Update-SessionEnvironment -} - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCBkgOQ4Avnj1iK -# H7oaZfnNGQVkYLA6zfCUaBqhOLwzBaCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCBkid9XwRFkg9OIrIQioLgJL8jSoyulSpf1rK8lxF2oETANBgkqhkiG -# 9w0BAQEFAASCAYBSBqDLnV4HgDrbe+TXqWlAl3f9mKPRz/rDh/L1Pu464yKv9JvV -# 8KKd7JXSkPLIrMjbpizbP94RWLIm+k/Czs2MyZeS//5IE13JTysf9L7czb9uykDO -# ZkXWpoC724alaoaJI+u41QtEkSxn8m6+Jth5K2ZHXBZ/dewsmT5UTxvHSzVkaLh7 -# a05WLHvlsSI2jA+z7rkfaKJNbbgiQh5tYnFjA9HszIL+c1/fEcj3DpMWg03rExAr -# RguzAtJpB1uSYtWos3INl8rdwhSCKCO0Gc7bZDnl8sp8PMmWQVQWkcYkO403mvoN -# CVzVeC6kveIDqIcU8jVFLYk573cRV+AvQmLvyyoCmQeP4uGskY3bGEUHf/v/NPrA -# nWHu4IK33ai8pHQN6VdOVCJZVA+xiRQTPtY4uk51EOXxLwms981Hf6Bz798DDjW3 -# F8YCkzlCe+1nR/rsfjpLBAp3ZAWI+x2XwWHQIZb0oM+dxjZ63erZGEYw2VZn4b/l -# A0sODlSCGYcWw3qhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTM0WjAvBgkq -# hkiG9w0BCQQxIgQgGLQZXZzCsuJr/p4iDwhyGiGCRgDxiIsqqENi929imCkwDQYJ -# KoZIhvcNAQEBBQAEggIAanZZuGQWF0Mgjy9fI22XMlyJ2l33vGjRBJTNWZdtI3dt -# gCco8ApjwpVVoOqtxfRdnlxYM2FNgW0VBwWYBBwkLGQEWF+JYWshiZxybEYztL0S -# 9w3RWePVagbKXqRxEIrF7e505tdqwK+GTLybG2te8hRzBjLYyAs0LeTZexbfFH9/ -# Peoqpz6BP7Mp9Rhoon1lcwO9NcJNKhuAR1f97pxwbru1SFFpNpmZ+Sr3mml6u/RP -# ATK9y7XWMu2W6WUUKHXSoh6TLzIMmwNbcAabmReyhb13KBJkcPXDCoSBQ5d2L+F4 -# 9ZaOtRluRgQWYatnQLAXmPzQrvAoL/saL9JxJ0pdESh0vf+OojYJTNsPjQSE6OFI -# REFNIYUHYdglMPtWOVrblJfhwBA3VlnUJ5f0+V2vQn0U/9oxKIFFW4MRWhKQlcRr -# OURDhRJ0KIzmtB3IufVYBVY6tB4XPAy3c54Ooa1RQ83THBxi+Fq6yhWMeMK9Sipy -# 03o2Wxa7dwKBBkqQCTVYZEUl+56uo+J2wEbqITlf+fkFQoykJwCD8xW3AynEf9La -# PmOXUA24O0E99FLlSLlWJ2KszR1zYkIQlabZ4k4K/l7j1GOetvYio8xBtB1C80+X -# r2+iv7/OqXTDqvQ8L2MrERD/EBSmtdRVuRaHOuj/0L/MupRopFZLzj0i0EJqPqA= -# SIG # End signature block diff --git a/src/chocolatey.resources/helpers/functions/Test-ProcessAdminRights.ps1 b/src/chocolatey.resources/helpers/functions/Test-ProcessAdminRights.ps1 deleted file mode 100644 index fdd76ed80..000000000 --- a/src/chocolatey.resources/helpers/functions/Test-ProcessAdminRights.ps1 +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Test-ProcessAdminRights { - <# -.SYNOPSIS -Tests whether the current process is running with administrative rights. - -.DESCRIPTION -This function checks whether the current process has administrative -rights by checking if the current user identity is a member of the -Administrators group. It returns `$true` if the current process is -running with administrative rights, `$false` otherwise. - -On Windows Vista and later, with UAC enabled, the returned value -represents the actual rights available to the process, e.g. if it -returns `$true`, the process is running elevated. - -.INPUTS -None - -.OUTPUTS -System.Boolean -#> - - # do not log function call - ## Called from chocolateysetup.psm1 - wrap any Write-Host in try/catch - - $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent([Security.Principal.TokenAccessLevels]'Query,Duplicate')) - $isAdmin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) - Write-Debug "Test-ProcessAdminRights: returning $isAdmin" - - return $isAdmin -} - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAR0wqxYfxdPERM -# yExbZo1h+K2/BvVNPalCu8zBojzsbaCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCA/Gcu6CXn2ylJqq4PLXw3gVzIShGcsZ/K+vNzigHsTjzANBgkqhkiG -# 9w0BAQEFAASCAYDRFePWev1lv616D2eeX5MX1YQTB5qJ7P/xIq+JzRTEDWj7rUwF -# rjuqCO/EFD9X0v8EjvotAVkDggqpxNfduLm+Rm8pFTgolmkKDfSJh8zL7I+Y9JPt -# FwbCcRw5qGCGEzjOOTcOMdj+zRV0lNi4+MRbJd54TySC62cCMBDfzX27PBqWG/zp -# NqQnkWeFYAefy9xAEMWcbZ4dyh8g/BN2MZwBDa0Sn9kcsSwB/cFWWyqMLD1TLJD7 -# xERnK7BfaOqjDnyuvKYiuqNs+EUWLlZ4T8Bb7cQow/rqLdWErOFXYDUuy3hqsyWd -# cz+2YFcYujUcBfWr6xKRiV2NmLnT45FzOmwbY7J67Pg/TMY/gqo1y+snzLPoEiA4 -# ms7Cx4sx5wFjCcoGBu4iDNYkJaTFY+ieak1b1QpH4VbCJjXzIs3ZZNZtb+mqRdO0 -# aGxMZAAvsMLCfEoa0oG7ECcShnHtEq0vT6J4Vtb4bv1Q/btN5toIuTRa9AU9qF6j -# zl8S2xsTgAXJBrShggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTM2WjAvBgkq -# hkiG9w0BCQQxIgQgo4joh326sw0yLRB698IaZ7u3/+qin+4FULMDm0dwOx0wDQYJ -# KoZIhvcNAQEBBQAEggIAf1GgmedyzgGpFoW1ZjCLbNa06rSvFOgzxV+TRL177MGa -# 3BVZXv0mj2TT4WFRnQLUotQjcYA0kEqMTN3kNS9EunsjsTU0KsCiCboosNBXGbY+ -# QKP0Mr3Fa7rkHuOL7XN6mX8s1jSjke2B0xPb8JJ6fqsR1uTySn4dHtF6oGZ86xG1 -# ubxht2+vG3vWUlXMrsnTYeI4VKtyM5qBZx/gJ5FCOArvAKdQpDI2WmhKbkYaHb4l -# L6n1TKVQo+MKKIrwnceCwcCIOt7dBEAr87AnCOj60bkRhIHrghkZ/Y3eAothmRuM -# wEiNG7QR7husSo72gbvGz4XzFVUHodlEbPENj/pqO7pFfuIVWH+7Sf4sbvMTsZo0 -# yXKDyNc/j5NuZBCHu6RbbmLL6ceNMgoksmi3mDDW/saPj/kCef3uDoXMfV9FCXIn -# 9VpRBA3M4BLkX1Y8KW9wDvcImYsW31XjRfHOc6CJ4r1um1daBIOPSk1xhGRbfBJG -# Nhj1Fl4+EQ0kivbaC48wdpvgFee+7Xc3yVigwP6RN6VqawYgkNY7rYKy6pbsvO4y -# gvNEmlmFno980xooViETEMKOss+vtDRbMHAJpKDpVttJba/nAMVe2pFq+lmNSfaf -# I7buoWy8+DiOGDqIp3rFwmvWdHtq4maGB5Q4rXiVp1pbhEqZbUXk/eQJA8L5MtU= -# SIG # End signature block diff --git a/src/chocolatey.resources/helpers/functions/Update-SessionEnvironment.ps1 b/src/chocolatey.resources/helpers/functions/Update-SessionEnvironment.ps1 deleted file mode 100644 index 53950f22b..000000000 --- a/src/chocolatey.resources/helpers/functions/Update-SessionEnvironment.ps1 +++ /dev/null @@ -1,318 +0,0 @@ -# Copyright © 2017 - 2021 Chocolatey Software, Inc. -# Copyright © 2015 - 2017 RealDimensions Software, LLC -# Copyright © 2011 - 2015 RealDimensions Software, LLC & original authors/contributors from https://github.com/chocolatey/chocolatey -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function Update-SessionEnvironment { - <# -.SYNOPSIS -Updates the environment variables of the current powershell session with -any environment variable changes that may have occurred during a -Chocolatey package install. - -.DESCRIPTION -When Chocolatey installs a package, the package author may add or change -certain environment variables that will affect how the application runs -or how it is accessed. Often, these changes are not visible to the -current PowerShell session. This means the user needs to open a new -PowerShell session before these settings take effect which can render -the installed application nonfunctional until that time. - -Use the Update-SessionEnvironment command to refresh the current -PowerShell session with all environment settings possibly performed by -Chocolatey package installs. - -.NOTES -This method is also added to the user's PowerShell profile as -`refreshenv`. When called as `refreshenv`, the method will provide -additional output. - -Preserves `PSModulePath` as set by the process. - -.INPUTS -None - -.OUTPUTS -None -#> - - Write-FunctionCallLogMessage -Invocation $MyInvocation -Parameters $PSBoundParameters - - $refreshEnv = $false - $invocation = $MyInvocation - if ($invocation.InvocationName -eq 'refreshenv') { - $refreshEnv = $true - } - - if ($refreshEnv) { - Write-Output 'Refreshing environment variables from the registry for powershell.exe. Please wait...' - } - else { - Write-Verbose 'Refreshing environment variables from the registry.' - } - - $userName = $env:USERNAME - $architecture = $env:PROCESSOR_ARCHITECTURE - $psModulePath = $env:PSModulePath - - #ordering is important here, $user should override $machine... - $ScopeList = 'Process', 'Machine' - if ('SYSTEM', "${env:COMPUTERNAME}`$" -notcontains $userName) { - # but only if not running as the SYSTEM/machine in which case user can be ignored. - $ScopeList += 'User' - } - foreach ($Scope in $ScopeList) { - Get-EnvironmentVariableNames -Scope $Scope | - ForEach-Object { - Set-Item "Env:$_" -Value (Get-EnvironmentVariable -Scope $Scope -Name $_) - } - } - - #Path gets special treatment b/c it munges the two together - $paths = 'Machine', 'User' | - ForEach-Object { - (Get-EnvironmentVariable -Name 'PATH' -Scope $_) -split ';' - } | - Select-Object -Unique - $Env:PATH = $paths -join ';' - - # PSModulePath is almost always updated by process, so we want to preserve it. - $env:PSModulePath = $psModulePath - - # reset user and architecture - if ($userName) { - $env:USERNAME = $userName; - } - if ($architecture) { - $env:PROCESSOR_ARCHITECTURE = $architecture; - } - - if ($refreshEnv) { - Write-Output 'Finished' - } -} - -Set-Alias refreshenv Update-SessionEnvironment - -# SIG # Begin signature block -# MIInKwYJKoZIhvcNAQcCoIInHDCCJxgCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD5/RFzaOhm0x0b -# z1A/0EhtNvspeG0kMbMPNfRQBUzivKCCIK4wggWNMIIEdaADAgECAhAOmxiO+dAt -# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa -# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E -# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy -# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF -# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 -# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB -# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR -# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 -# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB -# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S -# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x -# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB -# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP -# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC -# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp -# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv -# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB -# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc -# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov -# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy -# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW -# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF -# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z -# twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG -# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy -# dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx -# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy -# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg -# Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH -# JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf -# UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w -# 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk -# tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb -# qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm -# cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 -# 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK -# QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo -# 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB -# Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche -# MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB -# /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU -# 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG -# CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j -# c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig -# NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI -# hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd -# 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC -# qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl -# /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC -# RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT -# gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ -# a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 -# xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL -# NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 -# YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ -# RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG -# sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw -# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw -# HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN -# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr -# PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM -# gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg -# nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC -# EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 -# p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa -# khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 -# XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I -# HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 -# FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH -# X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 -# 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD -# VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k -# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD -# AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj -# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t -# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 -# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww -# HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB -# ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j -# fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI -# moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf -# JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx -# oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 -# LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx -# 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 -# Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I -# Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug -# 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 -# Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ -# BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX -# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 -# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw -# MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp -# Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X -# 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU -# UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa -# 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt -# XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 -# pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 -# cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY -# QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 -# c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw -# 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c -# kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR -# B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD -# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG -# BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq -# II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw -# T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH -# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD -# MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB -# BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL -# BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF -# 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC -# QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc -# jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 -# wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF -# KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP -# 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP -# NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr -# moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 -# obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ -# uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIG7TCCBNWg -# AwIBAgIQBNI793flHTneCMtwLiiYFTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 -# IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex -# MB4XDTI0MDUwOTAwMDAwMFoXDTI3MDUxMTIzNTk1OVowdTELMAkGA1UEBhMCVVMx -# DzANBgNVBAgTBkthbnNhczEPMA0GA1UEBxMGVG9wZWthMSEwHwYDVQQKExhDaG9j -# b2xhdGV5IFNvZnR3YXJlLCBJbmMxITAfBgNVBAMTGENob2NvbGF0ZXkgU29mdHdh -# cmUsIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAPDJgdZWj0RV -# lBBBniCyGy19FB736U5AahB+dAw3nmafOEeG+syql0m9kzV0gu4bSd4Al587ioAG -# DUPAGhXf0R+y11cx7c1cgdyxvfBvfMEkgD7sOUeF9ggZJc0YZ4qc7Pa6qqMpHDru -# pjshvLmQMSLaGKF68m+w2mJiZkLMYBEotPiAC3+IzI1MQqidCfN6rfQUmtcKyrVz -# 2zCt8CvuR3pSyNCBcQgKZ/+NwBfDqPTt1wKq5JCIQiLnbDZwJ9F5433enzgUGQgh -# KRoIwfp/hap7t7lrNf859Xe1/zHT4qtNgzGqSdJ2Kbz1YAMFjZokYHv/sliyxJN9 -# 7++0BApX2t45JsQaqyQ60TSKxqOH0JIIDeYgwxfJ8YFmuvt7T4zVM8u02Axp/1YV -# nKP2AOVca6FDe9EiccrexAWPGoP+WQi8WFQKrNVKr5XTLI0MNTjadOHfF0XUToyF -# H8FVnZZV1/F1kgd/bYbt/0M/QkS4FGmJoqT8dyRyMkTlTynKul4N3QIDAQABo4IC -# AzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE -# FFpfZUilS5A+fjYV80ib5qKkBoczMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYI -# KwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8E -# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZN -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNp -# Z25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0 -# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 -# NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu -# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEB -# CwUAA4ICAQAW9ANNkR2cF6ulbM+/XUWeWqC7UTqtsRwj7WAo8XTr52JebRchTGDH -# BZP9sDRZsFt+lPcPvBrv41kWoaFBmebTaPMh6YDHaON+uc19CTWXsMh8eog0lzGU -# iA3mKdbVit0udrgNlBUqTIuvMlMFIARWSz90FMeQrCFokLmqoqjp7u0sVPM7ng6T -# 9D8ct/m5LSpIa5TJCjAfyfw75GK0wzTDdTi1MgiAIyX0EedMrEwXjOjSApQ+uhIW -# v/AHDf8ukJzDFTTeiUkYZ1w++z70QZkzLfQTi6eH9vqgyXWcnGCwOxKquqe8RSIe -# M3FdtLstn9nI8S4qeiKdmomG6FAZTzYiGULJdJGsLh6Uii56zZdq3bSre/yrfed4 -# hf/0MqEtWSU7LpkWM8AApRkIKRBZIQ73/7WxwsF9kHoZxqoRMDGTzWt+S7/XrSOa -# QbKf0CxdxMPHKC2A1u3xGNDChtQEwpHxYXf/teD7GeFYFQJg/wn4dC72mZze97+c -# YcpmI4R13Q7owmRthK1hnuq4EOQIcoTPbQXiaRzULbYrcOnJi7EbXcqdeAAnZAyV -# b6zGqAaE9Sw4RYvkosL5IlBgrdIwSFJMbeirBoM2GukIHQ8UaEu3l1PoNQvVbqM1 -# 8zHiN4WA4rp9G9wfcAlZWq9iKF34sA+Xu03qSVaKPKn6YJMl5PfUsDGCBdMwggXP -# AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw -# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 -# IFNIQTM4NCAyMDIxIENBMQIQBNI793flHTneCMtwLiiYFTANBglghkgBZQMEAgEF -# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor -# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 -# DQEJBDEiBCDNWlZWqniEE5nz+hLaFbSB/13YuQBQoEWzN8rddzCSpTANBgkqhkiG -# 9w0BAQEFAASCAYAKpM9P93NhL1L0nu1HFLThwH+UJ1Cy0RKwq6FMjQ8OcE2oE2We -# SxxIWLouwVeKp0XUZyTcHUWjW+kjPWu1ytz68y+MF4U1sv8QRiDFlDfqat0+Q1sG -# mVbsE8FEBbLyM7NhDy6UrvjNVTq1cPYtJEgECiLBL/gafBvZxwVgU9zU3meHg3lg -# 6clyceGU3ddidaHljvHShIeroi2y4vNISIh3ATwvVIG7PFPg48cLLdasHRQfOcE3 -# tAvSYooTh4DPgqY9PswaNb6FfzpHKh5n/oQu94BS6hIMHlFi8KtYNubvfCKSMIf6 -# ysCbBAE57uJCJVKHYn6XKOh+6PpVOdpw0Jh/OTF9YIgElOGcx33yTU7RHPBo2n8x -# rUuxwm4dSvF//qi5YucyhovVKNIq5WAuTkzthFRDaML6Q8yj+a9k6R95e8q0Bsjt -# hAVu8/T+3Q6XTkZmk4VAHaL+NYcNxJ8yRw/4cwhwxXCMAafKEBw8TArWSPUV6+pP -# XBNw1n4Bq4rGUFKhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQsw -# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp -# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB -# AhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD -# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwNTE2MTYxOTM4WjAvBgkq -# hkiG9w0BCQQxIgQgUDX0/gBo/wI/qhiYP24/d0hy2oS2ArTKcfvnQZ1qTrcwDQYJ -# KoZIhvcNAQEBBQAEggIAcNHBWZk9mgrZySSVO843nQMsQ4jN0c95bnD+o0jGySNc -# 1EV6rNMBuJWbRgpsT3xawrhx+w7IPWcrs8wNmsuC8R1QWyCHv6d1F9QeB3sWiILr -# OTxU6Isf5Oy6qlESZGH5yUJ5ITrEQNzFUQatp1FPmYrELUUGBb9Xvdf1c7C2jL98 -# pH0FACM2GTe+UAQUidojlqu1dMlKlWvG0Wtkw7ZGce95/SODF7cuRoU1dbpzgPAT -# aS0r1AEb1D7zzq+fovF0OaFPvW2YNGu45/MVQiTsZkPvbLPDYtzqkHDbMc1Ykbm+ -# ptLeK1LkWowwk7Jd5NAZjze4VGnG5XL1wNx+eL+fiHG8EyqR5rPYf1b6F7VNNTCk -# UNZyqpOiTtlZwkuOY2L/kkSii7+aihq0LM+32u9sYJvZnvOIYh+/0s4ZKbVXmp11 -# 9HPEhC6S7sUF7NLphU4MOruaIYGAjhtk7Jets/R0IMfHXy6WANcuhMGsfIxZEhB3 -# 3srrSZqmEE79ky10jC8l6e4n5LuvBZnYP6gglvtPNyOw30l77cRaV5eqM4QfzyjT -# ZVNmqYSRZzhw7NRcFHF3JV1eG0DzhAd4TOOcEwk5dSY73AvYV6ozoXBZpm0Dcceh -# cUoGPfasi6P+cFzksP1V+TCv5jnN0NjLX04d3vdZe7iIgI54gva93aYIaAhYLoE= -# SIG # End signature block diff --git a/src/chocolatey.sln b/src/chocolatey.sln index c2b6ac88f..8bbca092e 100644 --- a/src/chocolatey.sln +++ b/src/chocolatey.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32901.82 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34330.188 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "chocolatey.console", "chocolatey.console\chocolatey.console.csproj", "{E24E3386-244F-4404-9E6E-5B53818EA903}" EndProject @@ -54,6 +54,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "chocolatey", "chocolatey", EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "chocolatey.install", "chocolatey.install\chocolatey.install.wixproj", "{6B96B4AE-8FD2-4719-AAFB-BA027B798089}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chocolatey.PowerShell", "Chocolatey.PowerShell\Chocolatey.PowerShell.csproj", "{88396C46-8089-4814-A7D1-E18777FF6083}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -240,6 +242,42 @@ Global {6B96B4AE-8FD2-4719-AAFB-BA027B798089}.WIX|Mixed Platforms.Build.0 = WIX|x86 {6B96B4AE-8FD2-4719-AAFB-BA027B798089}.WIX|x86.ActiveCfg = WIX|x86 {6B96B4AE-8FD2-4719-AAFB-BA027B798089}.WIX|x86.Build.0 = WIX|x86 + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|x86.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Debug|x86.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|Any CPU.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|Any CPU.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|Mixed Platforms.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|Mixed Platforms.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|x86.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.NoResources|x86.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|Any CPU.Build.0 = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|x86.ActiveCfg = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.Release|x86.Build.0 = Release|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|Any CPU.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|Any CPU.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|Mixed Platforms.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|Mixed Platforms.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|x86.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficial|x86.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|Any CPU.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|Any CPU.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|Mixed Platforms.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|Mixed Platforms.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|x86.ActiveCfg = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.ReleaseOfficialNo7zip|x86.Build.0 = ReleaseOfficial|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|Any CPU.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|Any CPU.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|Mixed Platforms.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|Mixed Platforms.Build.0 = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|x86.ActiveCfg = Debug|Any CPU + {88396C46-8089-4814-A7D1-E18777FF6083}.WIX|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/chocolatey/infrastructure.app/ApplicationParameters.cs b/src/chocolatey/infrastructure.app/ApplicationParameters.cs index 933221208..8125f81d0 100644 --- a/src/chocolatey/infrastructure.app/ApplicationParameters.cs +++ b/src/chocolatey/infrastructure.app/ApplicationParameters.cs @@ -61,6 +61,11 @@ public static class ApplicationParameters public static readonly string LicensedAssemblyLocation = _fileSystem.FileExists(_fileSystem.CombinePaths(InstallLocation, "chocolatey.licensed.dll")) ? _fileSystem.CombinePaths(InstallLocation, "chocolatey.licensed.dll") : _fileSystem.CombinePaths(InstallLocation, "extensions", "chocolatey", "chocolatey.licensed.dll"); #endif + internal static readonly string ChocolateyPowerShellAssemblySimpleName = "Chocolatey.PowerShell"; + internal static readonly string ChocolateyPowerShellAssemblyLocation = _fileSystem.FileExists(_fileSystem.CombinePaths(InstallLocation, "Chocolatey.PowerShell.dll")) + ? _fileSystem.CombinePaths(InstallLocation, "Chocolatey.PowerShell.dll") + : _fileSystem.CombinePaths(InstallLocation, "helpers", "Chocolatey.PowerShell.dll"); + public static readonly string CommonAppDataChocolatey = _fileSystem.CombinePaths(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), Name); public static readonly string LoggingLocation = _fileSystem.CombinePaths(InstallLocation, "logs"); public static readonly string LoggingFile = @"chocolatey.log"; @@ -164,7 +169,6 @@ public static class Environment /// public static int DefaultWaitForExitInSeconds = 2700; public static int DefaultWebRequestTimeoutInSeconds = 30; - public static readonly string[] ConfigFileExtensions = new string[] { ".autoconf", ".config", ".conf", ".cfg", ".jsc", ".json", ".jsonp", ".ini", ".xml", ".yaml" }; public static readonly string ConfigFileTransformExtension = ".install.xdt"; public static readonly string[] ShimDirectorFileExtensions = new string[] { ".gui", ".ignore" }; diff --git a/src/chocolatey/infrastructure/registration/AssemblyResolution.cs b/src/chocolatey/infrastructure/registration/AssemblyResolution.cs index 1d3129871..bdebbb3d1 100644 --- a/src/chocolatey/infrastructure/registration/AssemblyResolution.cs +++ b/src/chocolatey/infrastructure/registration/AssemblyResolution.cs @@ -139,6 +139,13 @@ public static IAssembly LoadAssembly(string assemblySimpleName, string assemblyF { try { + // If we're trying to load Chocolatey.PowerShell (e.g., as a dependency of the licensed extension, + // we may need to alter the load file path. + if (assemblySimpleName == ApplicationParameters.ChocolateyPowerShellAssemblySimpleName) + { + assemblyFileLocation = ApplicationParameters.ChocolateyPowerShellAssemblyLocation; + } + IAssembly tempAssembly; #if FORCE_CHOCOLATEY_OFFICIAL_KEY tempAssembly = Assembly.Load(FileSystem.ReadFileBytes(assemblyFileLocation)); @@ -371,7 +378,8 @@ public static System.Reflection.Assembly ResolveExtensionOrMergedAssembly(object // There are things that are ILMerged into Chocolatey. Anything with // the right public key except extensions should use the choco/chocolatey assembly if (!requestedAssembly.Name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase) - && !requestedAssembly.Name.IsEqualTo(ApplicationParameters.LicensedChocolateyAssemblySimpleName)) + && !requestedAssembly.Name.IsEqualTo(ApplicationParameters.LicensedChocolateyAssemblySimpleName) + && !requestedAssembly.Name.IsEqualTo(ApplicationParameters.ChocolateyPowerShellAssemblySimpleName)) { return typeof(ConsoleApplication).Assembly; } diff --git a/tests/packages/add-path/add-path.nuspec b/tests/packages/add-path/add-path.nuspec new file mode 100644 index 000000000..8021a8069 --- /dev/null +++ b/tests/packages/add-path/add-path.nuspec @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + add-path + + + + 1.0.0 + + + + + + + + add-path (Install) + __REPLACE_AUTHORS_OF_SOFTWARE_COMMA_SEPARATED__ + + https://_Software_Location_REMOVE_OR_FILL_OUT_ + + + + + + + + + + + add-path SPACE_SEPARATED + __REPLACE__ + __REPLACE__MarkDown_Okay + + + + + + + + + + + + + + + + diff --git a/tests/packages/add-path/tools/chocolateyinstall.ps1 b/tests/packages/add-path/tools/chocolateyinstall.ps1 new file mode 100644 index 000000000..3627a1aec --- /dev/null +++ b/tests/packages/add-path/tools/chocolateyinstall.ps1 @@ -0,0 +1,17 @@ +$params = Get-PackageParameters +$path = $params["Path"] +$scope = $params["Scope"] + +if (-not $path) { + throw "You must specify the package parameter /Path" +} + +if (-not $scope) { + $scope = "User" +} + +Write-Host "Adding '$path' to PATH at scope $scope" + +Install-ChocolateyPath -PathToInstall $path -PathType $scope + +Write-Host "$scope PATH after install: $env:PATH" \ No newline at end of file diff --git a/tests/packages/add-path/tools/chocolateyuninstall.ps1 b/tests/packages/add-path/tools/chocolateyuninstall.ps1 new file mode 100644 index 000000000..14bc57b76 --- /dev/null +++ b/tests/packages/add-path/tools/chocolateyuninstall.ps1 @@ -0,0 +1,17 @@ +$params = Get-PackageParameters +$path = $params["Path"] +$scope = $params["Scope"] + +if (-not $path) { + throw "You must specify the package parameter /Path" +} + +if (-not $scope) { + $scope = "User" +} + +Write-Host "Removing '$path' from PATH at scope $scope" + +Uninstall-ChocolateyPath -PathToUninstall $path -PathType $scope + +Write-Host "$scope PATH after removal: $env:PATH" \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Get-EnvironmentVariable.Tests.ps1 b/tests/pester-tests/powershell-commands/Get-EnvironmentVariable.Tests.ps1 new file mode 100644 index 000000000..d0bf326a4 --- /dev/null +++ b/tests/pester-tests/powershell-commands/Get-EnvironmentVariable.Tests.ps1 @@ -0,0 +1,29 @@ +Describe 'Get-EnvironmentVariable helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + Context 'Gets the named environment variable value at the scope' -ForEach @( + @{ Scope = 'Process' } + @{ Scope = 'User' } + @{ Scope = 'Machine' } + ) { + BeforeDiscovery { + $variables = [Environment]::GetEnvironmentVariables($Scope).Keys | ForEach-Object { @{ Name = $_ } } + } + + It 'Gets the environment variable ""' -TestCases $variables { + $expectedValue = [Environment]::GetEnvironmentVariable($Name, $Scope) + Get-EnvironmentVariable -Name $Name -Scope $Scope | Should -BeExactly $expectedValue + } + } + + Context 'Can retrieve the PATH variable without expanding environment names for the scope' { + It 'Retrieves the PATH value with un-expanded environment names' { + Get-EnvironmentVariable -Name 'PATH' -Scope 'Machine' | Should -Match '%[^%;\]+%' + } + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Get-EnvironmentVariableNames.Tests.ps1 b/tests/pester-tests/powershell-commands/Get-EnvironmentVariableNames.Tests.ps1 new file mode 100644 index 000000000..927b95bc6 --- /dev/null +++ b/tests/pester-tests/powershell-commands/Get-EnvironmentVariableNames.Tests.ps1 @@ -0,0 +1,19 @@ +Describe 'Get-EnvironmentVariable helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + Context 'Gets the named environment variable value at the target scope' -ForEach @( + @{ Scope = 'Process' } + @{ Scope = 'User' } + @{ Scope = 'Machine' } + ) { + It 'Gets the complete list of environment variables in the scope"' -ForEach $variables { + $expectedValue = [Environment]::GetEnvironmentVariables($Scope).Keys + Get-EnvironmentVariableNames -Scope $Scope | Should -Be $expectedValue + } + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Install-ChocolateyPath.Tests.ps1 b/tests/pester-tests/powershell-commands/Install-ChocolateyPath.Tests.ps1 new file mode 100644 index 000000000..81706033b --- /dev/null +++ b/tests/pester-tests/powershell-commands/Install-ChocolateyPath.Tests.ps1 @@ -0,0 +1,82 @@ +Describe 'Install-ChocolateyPath helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + AfterAll { + Remove-Module "chocolateyInstaller" -Force + } + + Context 'Adding and removing PATH values' -ForEach @( + @{ Scope = 'Process' } + @{ Scope = 'User' } + @{ Scope = 'Machine' } + ) { + Context 'Path "<_>"' -ForEach @("C:\test", "C:\tools") { + It 'stores the value in the desired PATH scope' { + Install-ChocolateyPath -Path $_ -Scope $Scope + [Environment]::GetEnvironmentVariable('PATH', $_, $Scope) -split [IO.Path]::PathSeparator | Should -Contain $_ + } + } + } + + Context 'Edge cases' { + AfterEach { + Uninstall-ChocolateyPath -Path "C:\test" -Scope Process + } + + It 'successfully detects that a path is already present when it is missing a trailing slash that is present in PATH' { + Install-ChocolateyPath -Path "C:\test\" -Scope Process + Install-ChocolateyPath -Path "C:\test" -Scope Process + + @($env:PATH -split [IO.Path]::PathSeparator) -match "C:\\test" | Should -HaveCount 1 -Because "Install-ChocolateyPath should not add the same path more than once" + } + + It 'successfully detects that a path is already present when it has a trailing slash that is not present in PATH' { + Install-ChocolateyPath -Path "C:\test" -Scope Process + Install-ChocolateyPath -Path "C:\test\" -Scope Process + + @($env:PATH -split [IO.Path]::PathSeparator) -match "C:\\test" | Should -HaveCount 1 -Because "Install-ChocolateyPath should not add the same path more than once" + } + + It 'allows a subpath of a path already in PATH to be added' { + Install-ChocolateyPath -Path "C:\test" -Scope Process + Install-ChocolateyPath -Path "C:\test\subpath" -Scope Process + + @($env:PATH -split [IO.Path]::PathSeparator) | Should -Contain "C:\test\subpath" + } + } +} + +Describe 'Install-ChocolateyPath end-to-end tests with add-path package modifying PATH' -Tags Cmdlet -ForEach @( + @{ Scope = 'User' } + @{ Scope = 'Machine' } +) { + BeforeAll { + Initialize-ChocolateyTestInstall + $PackageUnderTest = 'add-path' + Restore-ChocolateyInstallSnapshot + $OriginalPath = [Environment]::GetEnvironmentVariable('PATH', $Scope) + $Output = Invoke-Choco install $PackageUnderTest --confirm --params "/Path=C:\test /Scope=$Scope" + } + + AfterAll { + Remove-ChocolateyInstallSnapshot + [Environment]::SetEnvironmentVariable('PATH', $OriginalPath, $Scope) + } + + It 'Exits with Success (0)' { + $Output.ExitCode | Should -Be 0 -Because $Output.String + } + + It 'Shows the path being added and the scope' { + $Output.String | Should -MatchExactly "Adding 'C:\\test' to PATH at scope $Scope" + } + + It 'Correctly modifies the PATH' { + [Environment]::GetEnvironmentVariable("PATH", $Scope) | Should -Match "C:\\test" + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Set-EnvironmentVariable.Tests.ps1 b/tests/pester-tests/powershell-commands/Set-EnvironmentVariable.Tests.ps1 new file mode 100644 index 000000000..6b5cc580c --- /dev/null +++ b/tests/pester-tests/powershell-commands/Set-EnvironmentVariable.Tests.ps1 @@ -0,0 +1,37 @@ +Describe 'Set-EnvironmentVariable helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + Context 'Sets an environment variable value at the target scope' -ForEach @( + @{ Scope = 'Process' } + @{ Scope = 'User' } + @{ Scope = 'Machine' } + ) { + BeforeDiscovery { + $variables = @( + @{ Name = "Test"; Value = "TestValue" } + @{ Name = "Environment"; Value = "1234" } + @{ Name = "Variable"; Value = "C:\test\path" } + ) + } + + Describe 'Setting environment variable ' -ForEach $variables { + It 'Sets the target environment variable in the proper scope, as well as current process scope' { + Set-EnvironmentVariable -Name $Name -Value $Value -Scope $Scope + [Environment]::GetEnvironmentVariable($Name, $Scope) | Should -BeExactly $Value + + if ($Scope -ne 'Process') { + [Environment]::GetEnvironmentVariable($Name) | Should -BeExactly $Value + } + } + + AfterAll { + Set-EnvironmentVariable -Name $Name -Value "" -Scope $Scope + } + } + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Test-ProcessAdminRights.Tests.ps1 b/tests/pester-tests/powershell-commands/Test-ProcessAdminRights.Tests.ps1 new file mode 100644 index 000000000..c8f89cd90 --- /dev/null +++ b/tests/pester-tests/powershell-commands/Test-ProcessAdminRights.Tests.ps1 @@ -0,0 +1,12 @@ +Describe 'Test-ProcessAdminRights helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + It 'should report true in an admin context' { + Test-ProcessAdminRights | Should -BeTrue -Because "We should run these tests exclusively as admin" + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Uninstall-ChocolateyPath.Tests.ps1 b/tests/pester-tests/powershell-commands/Uninstall-ChocolateyPath.Tests.ps1 new file mode 100644 index 000000000..6d15ff28c --- /dev/null +++ b/tests/pester-tests/powershell-commands/Uninstall-ChocolateyPath.Tests.ps1 @@ -0,0 +1,77 @@ +Describe 'Uninstall-ChocolateyPath helper function tests' -Tags Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + Context 'Adding and removing PATH values' -ForEach @( + @{ Scope = 'Process' } + @{ Scope = 'User' } + @{ Scope = 'Machine' } + ) { + Context 'Path "<_>"' -ForEach @("C:\test", "C:\tools") { + BeforeEach { + Install-ChocolateyPath -Path $_ -Scope $Scope + } + + It 'removes a stored PATH value in the desired PATH scope' { + Uninstall-ChocolateyPath -Path $_ -Scope $Scope + [Environment]::GetEnvironmentVariable('PATH', $_, $Scope) -split [IO.Path]::PathSeparator | Should -Not -Contain $_ + } + } + } + + Context 'Edge cases' { + It 'successfully detects that a path is present and removes it when it is missing a trailing slash that is present in PATH' { + Install-ChocolateyPath -Path "C:\test\" -Scope Process + Uninstall-ChocolateyPath -Path "C:\test" -Scope Process + + @($env:PATH -split [IO.Path]::PathSeparator) -match "C:\\test" | Should -BeNullOrEmpty + } + + It 'successfully detects that a path is present and removes it when it has a trailing slash that is not present in PATH' { + Install-ChocolateyPath -Path "C:\test" -Scope Process + Uninstall-ChocolateyPath -Path "C:\test\" -Scope Process + + @($env:PATH -split [IO.Path]::PathSeparator) -match "C:\\test" | Should -BeNullOrEmpty + } + } +} + +Describe 'Uninstall-ChocolateyPath end-to-end tests with add-path package' -Tags Cmdlet -ForEach @( + @{ Scope = 'User' } + @{ Scope = 'Machine' } +) { + BeforeAll { + Initialize-ChocolateyTestInstall + $PackageUnderTest = 'add-path' + Restore-ChocolateyInstallSnapshot + $OriginalPath = [Environment]::GetEnvironmentVariable('PATH', $Scope) + $install = Invoke-Choco install $PackageUnderTest --confirm --params "/Path=C:\test /Scope=$Scope" + + if ($install.ExitCode -ne 0) { + throw "Setup failed, could not install ${PackageUnderTest}: $($install.String)" + } + + $Output = Invoke-Choco uninstall $PackageUnderTest --confirm --params "/Path=C:\test /Scope=$Scope" + } + + AfterAll { + Remove-ChocolateyInstallSnapshot + [Environment]::SetEnvironmentVariable('PATH', $OriginalPath, $Scope) + } + + It 'Exits with Success (0)' { + $Output.ExitCode | Should -Be 0 -Because $Output.String + } + + It 'Shows the path being added and the scope' { + $Output.String | Should -MatchExactly "Removing 'C:\\test' from PATH at scope $Scope" + } + + It 'Correctly modifies the PATH' { + [Environment]::GetEnvironmentVariable("PATH", $Scope) | Should -BeExactly $OriginalPath + } +} \ No newline at end of file diff --git a/tests/pester-tests/powershell-commands/Update-SessionEnvironment.Tests.ps1 b/tests/pester-tests/powershell-commands/Update-SessionEnvironment.Tests.ps1 new file mode 100644 index 000000000..742bc3da5 --- /dev/null +++ b/tests/pester-tests/powershell-commands/Update-SessionEnvironment.Tests.ps1 @@ -0,0 +1,28 @@ +Describe 'Update-SessionEnvironment helper function tests' -Tag Cmdlets { + BeforeAll { + Initialize-ChocolateyTestInstall + + $testLocation = Get-ChocolateyTestLocation + Import-Module "$testLocation\helpers\chocolateyInstaller.psm1" + } + + Context 'Refreshing environment' { + BeforeAll { + [Environment]::SetEnvironmentVariable("Test", "user-value", "User") + [Environment]::SetEnvironmentVariable("Test2", "machine-value", "Machine") + $env:Test3 = "process-value" + } + + It 'successfully refreshes values into the process' { + Update-SessionEnvironment + $env:Test | Should -BeExactly 'user-value' + $env:Test2 | Should -BeExactly 'machine-value' + $env:Test3 | Should -BeNullOrEmpty -Because 'Process-only values should not be preserved' + } + + AfterAll { + [Environment]::SetEnvironmentVariable("Test", [string]::Empty, "User") + [Environment]::SetEnvironmentVariable("Test2", [string]::Empty, "Machine") + } + } +} \ No newline at end of file diff --git a/update-cmdlet-documentation.ps1 b/update-cmdlet-documentation.ps1 new file mode 100644 index 000000000..c9eb6dff6 --- /dev/null +++ b/update-cmdlet-documentation.ps1 @@ -0,0 +1,77 @@ +<# +.SYNOPSIS +Generates Markdown documentation for the Chocolatey.PowerShell portion of Chocolatey's installer module commands. + +.DESCRIPTION +Use this script when modifying or adding commands into the Chocolatey.PowerShell project. +You will need the chocolatey/docs repository cloned locally in order to use this script. +When all documentation files this script is monitoring have been filled out (contain no remaining {{ template tokens }}), this script will generate/update the external help xml files for PowerShell. +#> +[CmdletBinding()] +param( + # Specify the path to the chocolatey/docs repository root locally. Defaults to ../docs + [Parameter()] + [string] + $DocsRepositoryPath = "$PSScriptRoot/../docs", + + # Specify the new commands' names to generate new documentation pages for them. + [Parameter()] + [Alias('NewCommands')] + [string[]] + $NewCommand, + + # Opens any new or incomplete files in the default editor for Markdown (.md) files for editing. + [Parameter()] + [switch] + $OpenUnfinished +) + +if (-not (Get-Module -ListAvailable PlatyPS)) { + Write-Warning "PlatyPS module not found, attempting to install from PSGallery" + Install-Module PlatyPS -Scope CurrentUser +} + +$documentationPath = Join-Path $DocsRepositoryPath -ChildPath "input/en-us/create/cmdlets" +if (-not (Test-Path $DocsRepositoryPath)) { + throw "PowerShell commands docs folder was not found at '$documentationPath'. Please clone the chocolatey/docs repository locally first, and/or provide the path to the repo root as -DocsRepositoryPath to this script." +} + +$dllPath = "$PSScriptRoot/code_drop/temp/_PublishedLibs/Chocolatey.PowerShell_signed/Chocolatey.PowerShell.dll" + +if (-not (Test-Path $dllPath)) { + throw "Please run this repository's build.ps1 file before trying to build markdown help for this module." +} + +# Import the module .dll to generate / update help from. +Import-Module $dllPath + +if (-not (Get-Module Chocolatey.PowerShell)) { + throw "The Chocolatey.PowerShell module was not able to be loaded, exiting documentation generation." +} + +$newOrUpdatedFiles = [System.Collections.Generic.HashSet[System.IO.FileSystemInfo]] @( + if ($NewCommand) { + New-MarkdownHelp -Command $NewCommand -OutputFolder "$PSScriptRoot\docs" -ExcludeDontShow + } + + Update-MarkdownHelp -Path $documentationPath -ExcludeDontShow +) + +$incompleteFiles = $newOrUpdatedFiles | Select-String '\{\{[^}]+}}' | Select-Object -ExpandProperty Path + +if ($incompleteFiles) { + Write-Warning "The following files contain {{ template tokens }} from PlatyPS that must be replaced with help content before they are committed to the repository:" + $incompleteFiles | Write-Warning + + if ($OpenUnfinished) { + $incompleteFiles | Invoke-Item + } + + Write-Warning "Run this script again once these files have been updated in order to generate the XML help documentation for the module." +} +else { + New-ExternalHelp -Path $documentationPath -OutputPath "$PSScriptRoot/src/Chocolatey.PowerShell" +} + +# Output the new/updated files so calling user knows what files the script has touched. +$newOrUpdatedFiles \ No newline at end of file