public OperationResult DigitalSignatureVote(ClientPetitionVote vote)
        {
            OperationResult result;

            try
            {
                if (vote.PetitionID == 0)
                {
                    result = OperationResult.Fail(-2, "PetitionID was not provided.");
                    return(result);
                }

                // verify:
                IVerificationRepository verificationRepository;
                switch (vote.CertificateType)
                {
                case EntityDictionary.Certificate.Type.DPA:
                {
                    verificationRepository = new DpaVerificationRepository();
                    break;
                }

                case EntityDictionary.Certificate.Type.UACrypto:
                {
                    verificationRepository = new UaCryptoVerificationRepository();
                    break;
                }

                default:
                {
                    verificationRepository = new UaCryptoVerificationRepository();
                    break;
                }
                }

                var verificationResult       = verificationRepository.Verify(vote.SignedData);
                var isVerficationSuccessfull =
                    verificationResult.Descendants("Result").SingleOrDefault() != null &&
                    verificationResult.Descendants("Result").SingleOrDefault().Value == "Success" &&
                    verificationResult.Descendants("Serial").SingleOrDefault() != null &&
                    verificationResult.Descendants("Serial").SingleOrDefault().Value.Length > 0;

                if (!isVerficationSuccessfull)
                {
                    result = OperationResult.Fail(-3, "Certificate verification failed.");
                    return(result);
                }

                result = this.petitionVoteRepository.Vote(vote, verificationResult.Descendants("Serial").SingleOrDefault().Value);
            }
            catch (Exception exc)
            {
                result = OperationResult.ExceptionResult(exc);
            }

            return(result);
        }
        public OperationResult Post(ClientAgreementVote vote)
        {
            OperationResult result;

            try
            {
                if (vote.AgreementID == 0)
                {
                    result = OperationResult.Fail(-2, "AgreementID was not provided.");
                    return(result);
                }

                // verify:
                IVerificationRepository verificationRepository;
                switch (vote.CertificateType)
                {
                case EntityDictionary.Certificate.Type.DPA:
                {
                    verificationRepository =
                        // BUG: DPA verification server doesn't work properly
                        //new DpaVerificationRepository();
                        new UaCryptoVerificationRepository();
                    break;
                }

                case EntityDictionary.Certificate.Type.UACrypto:
                {
                    verificationRepository = new UaCryptoVerificationRepository();
                    break;
                }

                default:
                {
                    verificationRepository = new UaCryptoVerificationRepository();
                    break;
                }
                }

                var verificationResult       = verificationRepository.Verify(vote.SignedData);
                var isVerficationSuccessfull =
                    verificationResult.Descendants("Result").SingleOrDefault() != null &&
                    verificationResult.Descendants("Result").SingleOrDefault().Value == "Success" &&
                    verificationResult.Descendants("Serial").SingleOrDefault() != null &&
                    verificationResult.Descendants("Serial").SingleOrDefault().Value.Length > 0;

                if (!isVerficationSuccessfull)
                {
                    result = OperationResult.Fail(-3, "Certificate verification failed.");
                    return(result);
                }

                var agreementVote = new AgreementVote
                {
                    AgreementID = vote.AgreementID,
                    Certificate = new Certificate()
                    {
                        SerialNumber = verificationResult.Descendants("Serial").SingleOrDefault().Value
                    },
                    SignedData = vote.SignedData,
                    SignedHash = vote.Signature
                };
                result = this.agreementRepository.Vote(agreementVote);
            }
            catch (Exception exc)
            {
                result = OperationResult.ExceptionResult(exc);
            }

            return(result);
        }