protected override void ProcessRecord()
{
using (var vlt = Util.VaultHelper.GetVault(VaultProfile))
{
vlt.OpenStorage();
var v = vlt.LoadVault();
if (v.Registrations == null || v.Registrations.Count < 1)
throw new InvalidOperationException("No registrations found");
var ri = v.Registrations[0];
var r = ri.Registration;
if (v.Identifiers == null || v.Identifiers.Count < 1)
throw new InvalidOperationException("No identifiers found");
var ii = v.Identifiers.GetByRef(IdentifierRef, throwOnMissing: false);
if (ii == null)
throw new Exception("Unable to find an Identifier for the given reference");
var authzState = ii.Authorization;
if (ii.Challenges == null)
ii.Challenges = new Dictionary<string, AuthorizeChallenge>();
if (ii.ChallengeCompleted == null)
ii.ChallengeCompleted = new Dictionary<string, DateTime?>();
if (ii.ChallengeCleanedUp == null)
ii.ChallengeCleanedUp = new Dictionary<string, DateTime?>();
// Resolve details from inline or profile attributes
string challengeType = null;
string handlerName = null;
IReadOnlyDictionary<string, object> handlerParams = null;
IReadOnlyDictionary<string, object> cliHandlerParams = null;
if (HandlerParameters?.Count > 0)
cliHandlerParams = (IReadOnlyDictionary<string, object>
)PoshHelper.Convert<string, object>(HandlerParameters);
if (!Force && !CleanUp)
{
if (!authzState.IsPending())
throw new InvalidOperationException(
"authorization is not in pending state;"
+ " use Force flag to override this validation");
if (authzState.Challenges.Any(_ => _.IsInvalid()))
throw new InvalidOperationException(
"authorization already contains challenges in an invalid state;"
+ " use Force flag to override this validation");
}
if (!string.IsNullOrEmpty(HandlerProfileRef))
{
var ppi = v.ProviderProfiles.GetByRef(HandlerProfileRef, throwOnMissing: false);
if (ppi == null)
throw new ItemNotFoundException("no Handler profile found for the given reference")
.With(nameof(HandlerProfileRef), HandlerProfileRef);
var ppAsset = vlt.GetAsset(Vault.VaultAssetType.ProviderConfigInfo,
ppi.Id.ToString());
ProviderProfile pp;
using (var s = vlt.LoadAsset(ppAsset))
{
pp = JsonHelper.Load<ProviderProfile>(s);
}
if (pp.ProviderType != ProviderType.CHALLENGE_HANDLER)
throw new InvalidOperationException("referenced profile does not resolve to a Challenge Handler")
.With(nameof(HandlerProfileRef), HandlerProfileRef)
.With("actualProfileProviderType", pp.ProviderType.ToString());
if (!pp.ProfileParameters.ContainsKey(nameof(ChallengeType)))
throw new InvalidOperationException("handler profile is incomplete; missing Challenge Type")
.With(nameof(HandlerProfileRef), HandlerProfileRef);
challengeType = (string)pp.ProfileParameters[nameof(ChallengeType)];
handlerName = pp.ProviderName;
handlerParams = pp.InstanceParameters;
if (cliHandlerParams != null)
{
WriteVerbose("Override Handler parameters specified");
if (handlerParams == null || handlerParams.Count == 0)
{
WriteVerbose("Profile does not define any parameters, using override parameters only");
handlerParams = cliHandlerParams;
}
else
{
WriteVerbose("Merging Handler override parameters with profile");
var mergedParams = new Dictionary<string, object>();
foreach (var kv in pp.InstanceParameters)
mergedParams[kv.Key] = kv.Value;
foreach (var kv in cliHandlerParams)
mergedParams[kv.Key] = kv.Value;
handlerParams = mergedParams;
}
}
}
else
{
challengeType = ChallengeType;
handlerName = Handler;
handlerParams = cliHandlerParams;
}
AuthorizeChallenge challenge = null;
DateTime? challengeCompleted = null;
DateTime? challengeCleanedUp = null;
ii.Challenges.TryGetValue(challengeType, out challenge);
ii.ChallengeCompleted.TryGetValue(challengeType, out challengeCompleted);
ii.ChallengeCleanedUp.TryGetValue(challengeType, out challengeCleanedUp);
try
{
if (challenge == null || Regenerate)
{
using (var c = ClientHelper.GetClient(v, ri))
{
c.Init();
c.GetDirectory(true);
challenge = c.DecodeChallenge(authzState, challengeType);
ii.Challenges[challengeType] = challenge;
}
}
if (CleanUp && (Repeat || challengeCleanedUp == null))
{
using (var c = ClientHelper.GetClient(v, ri))
{
c.Init();
c.GetDirectory(true);
challenge = c.HandleChallenge(authzState, challengeType,
handlerName, handlerParams, CleanUp);
ii.ChallengeCleanedUp[challengeType] = DateTime.Now;
}
}
else if (Repeat || challengeCompleted == null)
{
using (var c = ClientHelper.GetClient(v, ri))
{
c.Init();
c.GetDirectory(true);
challenge = c.HandleChallenge(authzState, challengeType,
handlerName, handlerParams);
ii.ChallengeCompleted[challengeType] = DateTime.Now;
}
}
}
catch (AcmeClient.AcmeWebException ex)
{
ThrowTerminatingError(PoshHelper.CreateErrorRecord(ex, ii));
return;
}
vlt.SaveVault(v);
WriteObject(authzState);
}
}