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); }
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 } }