ACMESharp.POSH.CompleteChallenge.ProcessRecord C# (CSharp) Method

ProcessRecord() protected method

protected ProcessRecord ( ) : void
return void
        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);
            }
        }
CompleteChallenge