diff --git a/src/chocolatey/infrastructure.app/services/INugetService.cs b/src/chocolatey/infrastructure.app/services/INugetService.cs
index a11e5571ef..b12b2b606b 100644
--- a/src/chocolatey/infrastructure.app/services/INugetService.cs
+++ b/src/chocolatey/infrastructure.app/services/INugetService.cs
@@ -20,6 +20,7 @@ namespace chocolatey.infrastructure.app.services
using System.Collections.Concurrent;
using System.Collections.Generic;
using configuration;
+ using domain;
using results;
public interface INugetService : ISourceRunner
@@ -67,6 +68,15 @@ public interface INugetService : ISourceRunner
/// The configuration
IEnumerable GetInstalledPackages(ChocolateyConfiguration config);
+ ///
+ /// Gets the configuration from remembered arguments
+ ///
+ /// The original configuration.
+ /// The package information.
+ /// The modified configuration, so it can be used
+ ChocolateyConfiguration GetPackageConfigFromRememberedArguments(ChocolateyConfiguration config,
+ ChocolateyPackageInformation packageInfo);
+
#pragma warning disable IDE1006
[Obsolete("This overload is deprecated and will be removed in v3.")]
ConcurrentDictionary get_outdated(ChocolateyConfiguration config);
diff --git a/src/chocolatey/infrastructure.app/services/NugetService.cs b/src/chocolatey/infrastructure.app/services/NugetService.cs
index 63e7395d87..276664d9ef 100644
--- a/src/chocolatey/infrastructure.app/services/NugetService.cs
+++ b/src/chocolatey/infrastructure.app/services/NugetService.cs
@@ -1050,7 +1050,7 @@ public virtual ConcurrentDictionary Upgrade(ChocolateyCon
continue;
}
- SetConfigFromRememberedArguments(config, pkgInfo);
+ config = GetPackageConfigFromRememberedArguments(config, pkgInfo);
var pathResolver = NugetCommon.GetPathResolver(_fileSystem);
var nugetProject = new FolderNuGetProject(ApplicationParameters.PackagesLocation, pathResolver, NuGetFramework.AnyFramework);
@@ -1658,12 +1658,7 @@ public virtual ConcurrentDictionary GetOutdated(Chocolate
return outdatedPackages;
}
- ///
- /// Sets the configuration for the package upgrade
- ///
- /// The configuration.
- /// The package information.
- /// The original unmodified configuration, so it can be reset after upgrade
+ [Obsolete("This method is deprecated and will be removed in v3.")]
protected virtual ChocolateyConfiguration SetConfigFromRememberedArguments(ChocolateyConfiguration config, ChocolateyPackageInformation packageInfo)
{
if (!config.Features.UseRememberedArgumentsForUpgrades || string.IsNullOrWhiteSpace(packageInfo.Arguments)) return config;
@@ -1708,7 +1703,7 @@ protected virtual ChocolateyConfiguration SetConfigFromRememberedArguments(Choco
if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.Password)) config.SourceCommand.Password = originalConfig.SourceCommand.Password;
if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.Certificate)) config.SourceCommand.Certificate = originalConfig.SourceCommand.Certificate;
if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.CertificatePassword)) config.SourceCommand.CertificatePassword = originalConfig.SourceCommand.CertificatePassword;
-
+
if (originalConfig.CacheLocationArgumentWasPassed && !string.IsNullOrWhiteSpace(originalConfig.CacheLocation))
{
config.CacheLocation = originalConfig.CacheLocation;
@@ -1722,6 +1717,132 @@ protected virtual ChocolateyConfiguration SetConfigFromRememberedArguments(Choco
return originalConfig;
}
+ ///
+ /// Gets the configuration from remembered arguments
+ ///
+ /// The original configuration.
+ /// The package information.
+ /// The modified configuration, so it can be used
+ public virtual ChocolateyConfiguration GetPackageConfigFromRememberedArguments(ChocolateyConfiguration config, ChocolateyPackageInformation packageInfo)
+ {
+ if (!config.Features.UseRememberedArgumentsForUpgrades || string.IsNullOrWhiteSpace(packageInfo.Arguments)) return config;
+
+ var packageArgumentsUnencrypted = packageInfo.Arguments.ContainsSafe(" --") && packageInfo.Arguments.ToStringSafe().Length > 4 ? packageInfo.Arguments : NugetEncryptionUtility.DecryptString(packageInfo.Arguments);
+
+ var sensitiveArgs = true;
+ if (!ArgumentsUtility.SensitiveArgumentsProvided(packageArgumentsUnencrypted))
+ {
+ sensitiveArgs = false;
+ this.Log().Debug(ChocolateyLoggers.Verbose, "{0} - Adding remembered arguments: {1}".FormatWith(packageInfo.Package.Id, packageArgumentsUnencrypted.EscapeCurlyBraces()));
+ }
+
+ var packageArgumentsSplit = packageArgumentsUnencrypted.Split(new[] { " --" }, StringSplitOptions.RemoveEmptyEntries);
+ var packageArguments = new List();
+ foreach (var packageArgument in packageArgumentsSplit.OrEmpty())
+ {
+ var packageArgumentSplit = packageArgument.Split(new[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries);
+ var optionName = packageArgumentSplit[0].ToStringSafe();
+ var optionValue = string.Empty;
+ if (packageArgumentSplit.Length == 2)
+ {
+ optionValue = packageArgumentSplit[1].ToStringSafe().UnquoteSafe();
+ if (optionValue.StartsWith("'")) optionValue.UnquoteSafe();
+ }
+
+ if (sensitiveArgs)
+ {
+ this.Log().Debug(ChocolateyLoggers.Verbose, "{0} - Adding '{1}' to arguments. Values not shown due to detected sensitive arguments".FormatWith(packageInfo.Package.Id, optionName.EscapeCurlyBraces()));
+ }
+ packageArguments.Add("--{0}{1}".FormatWith(optionName, string.IsNullOrWhiteSpace(optionValue) ? string.Empty : "=" + optionValue));
+ }
+
+ var originalConfig = config.DeepCopy();
+ var rememberedOptionSet = new OptionSet();
+
+ rememberedOptionSet
+ .Add("pre|prerelease",
+ "Prerelease - Include Prereleases? Defaults to false.",
+ option => config.Prerelease = option != null)
+ .Add("i|ignoredependencies|ignore-dependencies",
+ "IgnoreDependencies - Ignore dependencies when installing package(s). Defaults to false.",
+ option => config.IgnoreDependencies = option != null)
+ .Add("x86|forcex86",
+ "ForceX86 - Force x86 (32bit) installation on 64 bit systems. Defaults to false.",
+ option => config.ForceX86 = option != null)
+ .Add("ia=|installargs=|install-args=|installarguments=|install-arguments=",
+ "InstallArguments - Install Arguments to pass to the native installer in the package. Defaults to unspecified.",
+ option => config.InstallArguments = option.remove_surrounding_quotes())
+ .Add("o|override|overrideargs|overridearguments|override-arguments",
+ "OverrideArguments - Should install arguments be used exclusively without appending to current package passed arguments? Defaults to false.",
+ option => config.OverrideArguments = option != null)
+ .Add("argsglobal|args-global|installargsglobal|install-args-global|applyargstodependencies|apply-args-to-dependencies|apply-install-arguments-to-dependencies",
+ "Apply Install Arguments To Dependencies - Should install arguments be applied to dependent packages? Defaults to false.",
+ option => config.ApplyInstallArgumentsToDependencies = option != null)
+ .Add("params=|parameters=|pkgparameters=|packageparameters=|package-parameters=",
+ "PackageParameters - Parameters to pass to the package. Defaults to unspecified.",
+ option => config.PackageParameters = option.remove_surrounding_quotes())
+ .Add("paramsglobal|params-global|packageparametersglobal|package-parameters-global|applyparamstodependencies|apply-params-to-dependencies|apply-package-parameters-to-dependencies",
+ "Apply Package Parameters To Dependencies - Should package parameters be applied to dependent packages? Defaults to false.",
+ option => config.ApplyPackageParametersToDependencies = option != null)
+ .Add("allowdowngrade|allow-downgrade",
+ "AllowDowngrade - Should an attempt at downgrading be allowed? Defaults to false.",
+ option => config.AllowDowngrade = option != null)
+ .Add("u=|user=",
+ "User - used with authenticated feeds. Defaults to empty.",
+ option => config.SourceCommand.Username = option.remove_surrounding_quotes())
+ .Add("p=|password=",
+ "Password - the user's password to the source. Defaults to empty.",
+ option => config.SourceCommand.Password = option.remove_surrounding_quotes())
+ .Add("cert=",
+ "Client certificate - PFX pathname for an x509 authenticated feeds. Defaults to empty. Available in 0.9.10+.",
+ option => config.SourceCommand.Certificate = option.remove_surrounding_quotes())
+ .Add("cp=|certpassword=",
+ "Certificate Password - the client certificate's password to the source. Defaults to empty. Available in 0.9.10+.",
+ option => config.SourceCommand.CertificatePassword = option.remove_surrounding_quotes())
+ .Add("timeout=|execution-timeout=",
+ "CommandExecutionTimeout (in seconds) - The time to allow a command to finish before timing out. Overrides the default execution timeout in the configuration of {0} seconds. '0' for infinite starting in 0.10.4.".format_with(config.CommandExecutionTimeoutSeconds.to_string()),
+ option =>
+ {
+ int timeout = 0;
+ var timeoutString = option.remove_surrounding_quotes();
+ int.TryParse(timeoutString, out timeout);
+ if (timeout > 0 || timeoutString.is_equal_to("0"))
+ {
+ config.CommandExecutionTimeoutSeconds = timeout;
+ }
+ })
+ .Add("c=|cache=|cachelocation=|cache-location=",
+ "CacheLocation - Location for download cache, defaults to %TEMP% or value in chocolatey.config file.",
+ option => config.CacheLocation = option.remove_surrounding_quotes())
+ .Add("use-system-powershell",
+ "UseSystemPowerShell - Execute PowerShell using an external process instead of the built-in PowerShell host. Should only be used when internal host is failing. Available in 0.9.10+.",
+ option => config.Features.UsePowerShellHost = option != null);
+
+ rememberedOptionSet.Parse(packageArguments);
+
+ // there may be overrides from the user running upgrade
+ if (!string.IsNullOrWhiteSpace(originalConfig.PackageParameters)) config.PackageParameters = originalConfig.PackageParameters;
+ if (!string.IsNullOrWhiteSpace(originalConfig.InstallArguments)) config.InstallArguments = originalConfig.InstallArguments;
+ if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.Username)) config.SourceCommand.Username = originalConfig.SourceCommand.Username;
+ if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.Password)) config.SourceCommand.Password = originalConfig.SourceCommand.Password;
+ if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.Certificate)) config.SourceCommand.Certificate = originalConfig.SourceCommand.Certificate;
+ if (!string.IsNullOrWhiteSpace(originalConfig.SourceCommand.CertificatePassword)) config.SourceCommand.CertificatePassword = originalConfig.SourceCommand.CertificatePassword;
+
+ if (originalConfig.CacheLocationArgumentWasPassed && !string.IsNullOrWhiteSpace(originalConfig.CacheLocation))
+ {
+ config.CacheLocation = originalConfig.CacheLocation;
+ }
+
+ if (originalConfig.CommandExecutionTimeoutSecondsArgumentWasPassed)
+ {
+ config.CommandExecutionTimeoutSeconds = originalConfig.CommandExecutionTimeoutSeconds;
+ }
+
+ // We can't override switches because we don't know here if they were set on the command line
+
+ return config;
+ }
+
private bool HasMissingDependency(PackageResult package, List allLocalPackages)
{
foreach (var dependency in package.PackageMetadata.DependencyGroups.SelectMany(d => d.Packages))