public static int ProcessPut(string host, string id, string flag)
{
log.Info("Processing Vuln2.Put");
var candidateUsers = RegisterCandidates(host, flag.Distinct().Select(c => UsersManager.GenUser(null, c.ToString())).OrderBy(user => user.Login).ToArray());
var election = StartElection(host, candidateUsers[0], false, nominateTimeInSec, voteTimeInSec);
var privateKey = election.PrivateKeyForCandidates;
var sw = Stopwatch.StartNew();
election = NominateUsers(host, election, candidateUsers.Skip(1).ToArray());
sw.Stop();
var tts = nominateTimeInSec * 1000 - sw.ElapsedMilliseconds;
if(tts > 0)
{
log.InfoFormat("Sleeping for {0}ms before voting (nomination duration is {1}s)", tts, nominateTimeInSec);
Thread.Sleep((int) tts);
}
var votes = GenVotes(flag, election);
var voters = RegisterVoters(host, votes, candidateUsers);
log.InfoFormat("Voting by {0} voters", voters.Length);
foreach(var voter in voters)
ElectroClient.Vote(host, Program.PORT, voter.Key.Cookies, election.Id, HomoCrypto.EncryptVector(voter.Value, election.PublicKey));
log.Info("Voted");
var state = new Vuln2State
{
ElectionId = election.Id.ToString(),
Voter = voters[0].Key,
PrivateKey = privateKey
};
log.Info("Flag put");
Console.Out.WriteLine(Convert.ToBase64String(Encoding.UTF8.GetBytes(state.ToJsonString())));
return (int) ExitCode.OK;
}