public DtoActionResult InsertOrUpdate(EntityActiveClientPolicy activePolicy)
        {
            var actionResult = new DtoActionResult();
            var p            = new ServicePolicy().GetActivePolicy(activePolicy.PolicyId);

            if (p == null)
            {
                //insert
                _uow.ActiveClientPolicies.Insert(activePolicy);
                _uow.Save();
                actionResult.Success = true;
                actionResult.Id      = activePolicy.Id;
            }
            else
            {
                //update
                activePolicy.Id = p.Id;
                _uow.ActiveClientPolicies.Update(activePolicy, activePolicy.Id);
                _uow.Save();
                actionResult.Success = true;
                actionResult.Id      = activePolicy.Id;
            }

            return(actionResult);
        }
Example #2
0
        public DtoActionResult ActivatePolicy(int policyId, bool reRunExisting)
        {
            //Some extra verification is added here to ensure the active client policy accurately models the policy it was built from

            var policy = GetPolicy(policyId);

            if (policy == null)
            {
                return new DtoActionResult {
                           ErrorMessage = "Policy Not Found", Id = 0
                }
            }
            ;
            if (policy.Archived)
            {
                return new DtoActionResult {
                           ErrorMessage = "Archived Policies Cannot Be Activated", Id = 0
                }
            }
            ;

            var validationResult = new ValidatePolicy().Validate(policyId);

            if (!validationResult.Success)
            {
                return(new DtoActionResult()
                {
                    ErrorMessage = "Could Not Activate Policy. " + validationResult.ErrorMessage
                });
            }

            var originalHash = policy.Hash;
            //Update the existing policies hash
            var json    = JsonConvert.SerializeObject(new Workflows.ClientPolicyJson().Create(policyId));
            var newHash = FormsAuthentication.HashPasswordForStoringInConfigFile(json, "MD5");

            policy.Hash = newHash;
            _uow.PolicyRepository.Update(policy, policy.Id);
            if (policy.Hash != originalHash)
            {
                var policyHashHistory = new EntityPolicyHashHistory();
                policyHashHistory.PolicyId   = policy.Id;
                policyHashHistory.Hash       = newHash;
                policyHashHistory.Json       = json;
                policyHashHistory.ModifyTime = DateTime.UtcNow;
                _uow.PolicyHashHistoryRepository.Insert(policyHashHistory);
            }
            _uow.Save();

            //verify the new hash was saved correctly
            var updatedHashPolicy = GetPolicy(policyId);

            if (updatedHashPolicy == null)
            {
                return new DtoActionResult {
                           ErrorMessage = "Policy Not Found", Id = 0
                }
            }
            ;
            if (updatedHashPolicy.Hash != policy.Hash)
            {
                return new DtoActionResult {
                           ErrorMessage = "Could Not Update Policy Hash", Id = 0
                }
            }
            ;

            //Add active policy db entry after hash is added in
            var clientPolicy = JsonConvert.DeserializeObject <DtoClientPolicy>(json);

            clientPolicy.Hash          = newHash;
            clientPolicy.ReRunExisting = reRunExisting;
            var jsonWithHash       = JsonConvert.SerializeObject(clientPolicy);
            var activeClientPolicy = new EntityActiveClientPolicy();

            activeClientPolicy.PolicyId   = policy.Id;
            activeClientPolicy.PolicyJson = jsonWithHash;
            new ServiceActiveClientPolicy().InsertOrUpdate(activeClientPolicy);

            //Verify hash one last time
            var finalActivePolicy = new ServiceActiveClientPolicy().Get(activeClientPolicy.Id);

            if (finalActivePolicy == null)
            {
                return new DtoActionResult {
                           ErrorMessage = "Could Not Activate Policy", Id = 0
                }
            }
            ;
            //verify deserialization
            try
            {
                var deserializedClientPolicy = JsonConvert.DeserializeObject <DtoClientPolicy>(finalActivePolicy.PolicyJson);

                if (deserializedClientPolicy.Hash != newHash)
                {
                    new ServiceActiveClientPolicy().Delete(finalActivePolicy.Id);
                    return(new DtoActionResult {
                        ErrorMessage = "Could Not Verify Hash", Id = 0
                    });
                }
                else
                {
                    UpdateActiveGroups(policyId);
                    return(new DtoActionResult {
                        Success = true, Id = finalActivePolicy.Id
                    });
                }
            }
            catch (Exception ex)
            {
                new ServiceActiveClientPolicy().Delete(finalActivePolicy.Id);
                return(new DtoActionResult {
                    ErrorMessage = "Could Not Verify Client Policy Deserialization", Id = 0
                });
                //todo: add logging
            }
        }