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 Vote(ClientPetitionVote petitionVote, string certificateSerialNumber)
        {
            var vote = new PetitionVote()
            {
                PetitionID  = petitionVote.PetitionID,
                Certificate = new Certificate()
                {
                    SerialNumber = certificateSerialNumber
                },
                SignedData = petitionVote.SignedData,
                SignedHash = petitionVote.Signature
            };

            OperationResult result;

            using (var db = new EDEntities())
            {
                var certificate = db.Certificates.SingleOrDefault(c => c.SerialNumber == vote.Certificate.SerialNumber);
                if (certificate == null)
                {
                    result = OperationResult.Fail(-4, "Certificate is not registered.");
                    return(result);
                }

                vote.CertificateID = certificate.ID;
                vote.PersonID      = certificate.PersonID;
                vote.CreatedDate   = DateTime.Now;

                vote.Petition    = null;
                vote.Certificate = null;
                vote.Person      = null;

                ////var votes = (from p in db.PetitionVotes
                ////			 where p.PetitionID == vote.PetitionID
                ////				&& (p.PersonID == vote.PersonID || p.CertificateID == vote.CertificateID || p.Certificate.SerialNumber == vote.Certificate.SerialNumber)
                ////			 select p);
                //var votes = db.PetitionVotes.Where(p =>
                //	p.PetitionID == vote.PetitionID &&
                //	(p.PersonID == vote.PersonID || p.CertificateID == vote.CertificateID ||
                //	 p.Certificate.SerialNumber == vote.Certificate.SerialNumber));

                //if (votes.Any())
                //{
                //	result = OperationResult.Fail(-5, "You already voted for this petition.");
                //	return result;
                //}

                db.PetitionVotes.Add(vote);
                db.SaveChanges();

                result = OperationResult.Success(1, "Agreement vote has been registered.");
            }

            return(result);
        }