def one_voter_revotes_after_the_election_is_closed(self): voters_list_we_pick_from = self.voters_email_addresses_who_have_voted.keys() voters_who_will_vote_now = random.sample(voters_list_we_pick_from, 1) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails(self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters(voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.one_voter_casts_after_the_election_is_closed(voters_who_will_vote_now_data[0])
def some_voters_revote(self): voters_list_we_pick_from = self.voters_email_addresses_who_have_voted.keys() voters_who_will_vote_now = random.sample(voters_list_we_pick_from, settings.NUMBER_OF_REVOTING_VOTERS) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails(self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters(voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.some_voters_cast_their_vote(voters_who_will_vote_now_data)
def all_voters_vote(self): """ This function selects a random set of `NUMBER_OF_VOTING_VOTERS` voters, and casts their vote. Note: If you rather want to cast votes and check consistency for every batch of votes, see function `all_voters_vote_in_sequences()`. """ voters_who_will_vote_now = random.sample(self.voters_email_addresses, settings.NUMBER_OF_VOTING_VOTERS) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails(self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters(voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.some_voters_cast_their_vote(voters_who_will_vote_now_data)
def one_voter_revotes_after_the_election_is_closed(self): voters_list_we_pick_from = self.voters_email_addresses_who_have_voted.keys( ) voters_who_will_vote_now = random.sample(voters_list_we_pick_from, 1) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails( self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters( voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.one_voter_casts_after_the_election_is_closed( voters_who_will_vote_now_data[0])
def some_voters_revote(self): voters_list_we_pick_from = self.voters_email_addresses_who_have_voted.keys( ) voters_who_will_vote_now = random.sample( voters_list_we_pick_from, settings.NUMBER_OF_REVOTING_VOTERS) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails( self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters( voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.some_voters_cast_their_vote(voters_who_will_vote_now_data)
def generate_vote_ballots(self): invited_voters_who_will_vote = random.sample( self.voters_email_addresses, settings.NUMBER_OF_VOTING_VOTERS) invited_voters_who_will_vote_data = populate_credential_and_password_for_voters_from_sent_emails( self.distant_fake_sent_emails_manager, invited_voters_who_will_vote, settings.ELECTION_TITLE) invited_voters_who_will_vote_data = populate_random_votes_for_voters( invited_voters_who_will_vote_data) self.update_voters_data(invited_voters_who_will_vote_data) belenios_tool_generate_ballots(self.voters_data, self.credential_file_id, self.election_page_url)
def setUp(self): self.fake_sent_emails_manager = FakeSentEmailsManager(settings.SENT_EMAILS_TEXT_FILE_ABSOLUTE_PATH) self.fake_sent_emails_manager.install_fake_sendmail_log_file() if settings.START_SERVER: if settings.CLEAN_UP_POLICY == settings.CLEAN_UP_POLICIES.REMOVE_DATABASE: remove_database_folder() elif settings.CLEAN_UP_POLICY == settings.CLEAN_UP_POLICIES.REMOVE_ELECTION or settings.CLEAN_UP_POLICY == settings.CLEAN_UP_POLICIES.DO_NOTHING: pass self.server = initialize_server() self.browser = initialize_browser() if settings.ELECTION_ID: self.election_id = settings.ELECTION_ID else: # Download server's sent emails text file, so that we know up to which line number we have to ignore its contents (this is its last line) temporary_fake_sent_emails_manager = None try: temporary_fake_sent_emails_manager = self.download_all_sent_emails() self.fake_sent_emails_initial_lines_count = temporary_fake_sent_emails_manager.count_lines() console_log("### Initial lines count of server's fake sent emails file:", self.fake_sent_emails_initial_lines_count) finally: if temporary_fake_sent_emails_manager: temporary_fake_sent_emails_manager.uninstall_fake_sendmail_log_file() self.administrator_creates_election() console_log("### Starting step: download_all_sent_emails") self.distant_fake_sent_emails_manager = self.download_all_sent_emails() console_log("### Step complete: download_all_sent_emails") # Concatenate (distant) Belenios server's sent emails file (starting after line `fake_sent_emails_initial_lines_count`) and local credential authority's sent emails file into file `self.distant_fake_sent_emails_manager.log_file_path`, so that `self.generate_vote_ballots()` can parse it and find all information it needs. import subprocess import tempfile (file_handle, log_file_path) = tempfile.mkstemp(text=True) with open(log_file_path, 'w') as f: subprocess.run(["tail", "-n", "+" + str(self.fake_sent_emails_initial_lines_count + 1), self.distant_fake_sent_emails_manager.log_file_path], stdout=f) subprocess.run(["cat", self.fake_sent_emails_manager.log_file_path], stdout=f) subprocess.run(["cp", log_file_path, self.distant_fake_sent_emails_manager.log_file_path]) subprocess.run(["rm", "-f", log_file_path]) invited_voters_who_will_vote = random.sample(self.voters_email_addresses, settings.NUMBER_OF_VOTING_VOTERS) invited_voters_who_will_vote_data = populate_credential_and_password_for_voters_from_sent_emails(self.distant_fake_sent_emails_manager, invited_voters_who_will_vote, settings.ELECTION_TITLE) invited_voters_who_will_vote_data = populate_random_votes_for_voters(invited_voters_who_will_vote_data) self.update_voters_data(invited_voters_who_will_vote_data) selected_voter = invited_voters_who_will_vote_data[0] settings.VOTER_USERNAME = selected_voter["username"] settings.VOTER_PASSWORD = selected_voter["password"] settings.VOTER_CREDENTIAL = selected_voter["credential"] console_log("Going to vote using VOTER_USERNAME:"******"Going to vote using VOTER_PASSWORD:"******"Going to vote using VOTER_CREDENTIAL:", settings.VOTER_CREDENTIAL)
def all_voters_vote(self): """ This function selects a random set of `NUMBER_OF_VOTING_VOTERS` voters, and casts their vote. Note: If you rather want to cast votes and check consistency for every batch of votes, see function `all_voters_vote_in_sequences()`. """ voters_who_will_vote_now = random.sample( self.voters_email_addresses, settings.NUMBER_OF_VOTING_VOTERS) voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails( self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters( voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) self.some_voters_cast_their_vote(voters_who_will_vote_now_data)
def some_voters_vote_in_sequences(self, voters=None, start_index=0, end_index=None, verify_every_x_votes=5): """ Iterates over `voters` from index `start_index` to `end_index`, cast their vote, and checks vote data consistency for every batch of `verify_every_x_votes` votes (using `belenios_tool verify-diff` and a snapshot of election data copied in previous batch). """ if start_index < 0: raise Exception("start_index cannot be below 0") current_start_index = start_index if end_index is None: end_index = settings.NUMBER_OF_VOTING_VOTERS elif end_index > settings.NUMBER_OF_VOTING_VOTERS: raise Exception("end_index cannot exceeed NUMBER_OF_VOTING_VOTERS") if voters is None: voters = self.voters_email_addresses voters_who_will_vote_now = voters[start_index:end_index] voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails(self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters(voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) snapshot_folder = None while current_start_index < end_index: increment = verify_every_x_votes # could be randomized current_end_index = current_start_index + increment if current_end_index > end_index: current_end_index = end_index if current_start_index > 0: console_log("#### Starting substep: create_election_data_snapshot") snapshot_folder = create_election_data_snapshot(self.election_id) console_log("#### Substep complete: create_election_data_snapshot") try: console_log("#### A batch of " + str(current_end_index - current_start_index) + " voters, indexed " + str(current_start_index) + " to " + str(current_end_index - 1) + " are now going to vote") self.some_voters_cast_their_vote(voters_who_will_vote_now_data[current_start_index:current_end_index]) console_log("#### A batch of " + str(current_end_index - current_start_index) + " voters, indexed " + str(current_start_index) + " to " + str(current_end_index - 1) + " have now voted") if current_start_index > 0: console_log("#### Starting substep: verify_election_consistency using `belenios_tool verify-diff` (for a batch of votes)") verify_election_consistency(self.election_id, snapshot_folder) console_log("#### Substep complete: verify_election_consistency using `belenios_tool verify-diff` (for a batch of votes)") finally: if current_start_index > 0: console_log("#### Starting substep: delete_election_data_snapshot") delete_election_data_snapshot(snapshot_folder) console_log("#### Substep complete: delete_election_data_snapshot") current_start_index += increment
def some_voters_vote_in_sequences(self, voters=None, start_index=0, end_index=None, verify_every_x_votes=5): """ Iterates over `voters` from index `start_index` (included) to `end_index` (not included), cast their vote, and checks vote data consistency for every batch of `verify_every_x_votes` votes (using `belenios_tool verify-diff` and a snapshot of election data copied in previous batch). """ if start_index < 0: raise Exception("start_index cannot be below 0") current_start_index = start_index if end_index is None: end_index = settings.NUMBER_OF_VOTING_VOTERS elif end_index > settings.NUMBER_OF_VOTING_VOTERS: raise Exception("end_index cannot exceeed NUMBER_OF_VOTING_VOTERS") if voters is None: voters = self.voters_email_addresses voters_who_will_vote_now = voters[start_index:end_index] voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails( self.fake_sent_emails_manager, voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters( voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) snapshot_folder = None while current_start_index < end_index: increment = verify_every_x_votes # could be randomized current_end_index = current_start_index + increment if current_end_index > end_index: current_end_index = end_index if current_start_index > 0: console_log( "#### Starting substep: create_election_data_snapshot") snapshot_folder = create_election_data_snapshot( self.election_id) console_log( "#### Substep complete: create_election_data_snapshot") try: console_log("#### A batch of " + str(current_end_index - current_start_index) + " voters, indexed " + str(current_start_index) + " to " + str(current_end_index - 1) + " included are now going to vote") sublist_start_index = current_start_index - start_index sublist_end_index = current_end_index - start_index self.some_voters_cast_their_vote(voters_who_will_vote_now_data[ sublist_start_index:sublist_end_index]) console_log("#### A batch of " + str(current_end_index - current_start_index) + " voters, indexed " + str(current_start_index) + " to " + str(current_end_index - 1) + " included have now voted") if current_start_index > 0: console_log( "#### Starting substep: verify_election_consistency using `belenios_tool verify-diff` (for a batch of votes)" ) verify_election_consistency(self.election_id, snapshot_folder) console_log( "#### Substep complete: verify_election_consistency using `belenios_tool verify-diff` (for a batch of votes)" ) finally: if current_start_index > 0: console_log( "#### Starting substep: delete_election_data_snapshot") delete_election_data_snapshot(snapshot_folder) console_log( "#### Substep complete: delete_election_data_snapshot") current_start_index += increment
def test_scenario_2_manual_vote_with_monkeys(self): console_log( "### Running test method BeleniosTestElectionScenario2WithMonkeys::test_scenario_2_manual_vote_with_monkeys()" ) with ConsoleLogDuration( "### administrator_starts_creation_of_manual_election"): self.administrator_starts_creation_of_manual_election() with ConsoleLogDuration( "### credential_authority_sends_credentials_to_voters"): self.credential_authority_sends_credentials_to_voters() with ConsoleLogDuration("### administrator_invites_trustees"): self.administrator_invites_trustees() with ConsoleLogDuration("### trustees_generate_election_private_keys"): self.trustees_generate_election_private_keys() with ConsoleLogDuration( "### administrator_completes_creation_of_election"): self.administrator_completes_creation_of_election() with ConsoleLogDuration( "### verify_election_consistency using `belenios_tool verify` (#0)" ): verify_election_consistency(self.election_id) self.voters_data = { } # We reset this (set by `BeleniosTestElectionWithCreationBase`) because we generate voters data in several parts voters_who_will_vote = random.sample(self.voters_email_addresses, settings.NUMBER_OF_VOTING_VOTERS) console_log("voters who will vote:", voters_who_will_vote) start_index_of_voters_who_vote_in_first_part = 0 end_index_of_voters_who_vote_in_first_part = settings.NUMBER_OF_VOTING_VOTERS_IN_FIRST_PART console_log( f"number of (normal) voters who will vote in first part: {end_index_of_voters_who_vote_in_first_part} (indexes {start_index_of_voters_who_vote_in_first_part} included to {end_index_of_voters_who_vote_in_first_part} excluded)" ) start_index_of_voters_who_vote_in_second_part = end_index_of_voters_who_vote_in_first_part end_index_of_voters_who_vote_in_second_part = end_index_of_voters_who_vote_in_first_part + settings.NUMBER_OF_MONKEY_VOTING_VOTERS console_log( f"number of (smart monkey) voters who will vote in second part: {end_index_of_voters_who_vote_in_second_part - start_index_of_voters_who_vote_in_second_part} (indexes {start_index_of_voters_who_vote_in_second_part} included to {end_index_of_voters_who_vote_in_second_part} excluded)" ) start_index_of_voters_who_vote_in_third_part = end_index_of_voters_who_vote_in_second_part end_index_of_voters_who_vote_in_third_part = settings.NUMBER_OF_VOTING_VOTERS console_log( f"number of (normal) voters who will vote in third part: {end_index_of_voters_who_vote_in_third_part - start_index_of_voters_who_vote_in_third_part} (indexes {start_index_of_voters_who_vote_in_third_part} included to {end_index_of_voters_who_vote_in_third_part} excluded)" ) verify_every_x_votes = 5 with ConsoleLogDuration( "### some_voters_vote_in_sequences (first part)"): self.some_voters_vote_in_sequences( voters_who_will_vote, start_index=start_index_of_voters_who_vote_in_first_part, end_index=end_index_of_voters_who_vote_in_first_part, verify_every_x_votes=verify_every_x_votes) with ConsoleLogDuration("### smart monkeys vote (second part)"): smart_monkey_voters_who_will_vote_now = voters_who_will_vote[ start_index_of_voters_who_vote_in_second_part: end_index_of_voters_who_vote_in_second_part] timeout = settings.EXPLICIT_WAIT_TIMEOUT voters_who_will_vote_now_data = populate_credential_and_password_for_voters_from_sent_emails( self.fake_sent_emails_manager, smart_monkey_voters_who_will_vote_now, settings.ELECTION_TITLE) voters_who_will_vote_now_data = populate_random_votes_for_voters( voters_who_will_vote_now_data) self.update_voters_data(voters_who_will_vote_now_data) for idx, voter in enumerate(voters_who_will_vote_now_data): console_log( f"#### Voting as smart monkey {idx+1} of {settings.NUMBER_OF_MONKEY_VOTING_VOTERS}" ) voter_email_address = voter["email_address"] voter_username = voter["username"] voter_password = voter["password"] voter_credential = voter["credential"] voter_decided_vote = voter["votes"] election_url = voter[ "election_page_url"] # this is the same as `election_id_to_election_home_page_url(self.election_id)` smart_ballot_tracker = smart_monkey_votes( self.browser, timeout, election_url, voter_username, voter_password, voter_credential, voter_decided_vote) if smart_ballot_tracker: voter["smart_ballot_tracker"] = smart_ballot_tracker else: raise Exception( "Monkey voter did not complete its vote properly") self.voters_email_addresses_who_have_voted[ voter_email_address] = True self.browser.quit() self.browser = initialize_browser_for_scenario_2() with ConsoleLogDuration( "### some_voters_vote_in_sequences (third part)"): self.some_voters_vote_in_sequences( voters_who_will_vote, start_index=start_index_of_voters_who_vote_in_third_part, end_index=end_index_of_voters_who_vote_in_third_part, verify_every_x_votes=verify_every_x_votes) with ConsoleLogDuration( "### verify_election_consistency using `belenios_tool verify` (#1)" ): verify_election_consistency(self.election_id) with ConsoleLogDuration( "### Starting step: create_election_data_snapshot (#0)"): snapshot_folder = create_election_data_snapshot(self.election_id) console_log("snapshot_folder: ", snapshot_folder) try: with ConsoleLogDuration("### some_voters_revote"): self.some_voters_revote() with ConsoleLogDuration( "### verify_election_consistency using `belenios_tool verify-diff` (#2)" ): verify_election_consistency(self.election_id, snapshot_folder) finally: with ConsoleLogDuration("### delete_election_data_snapshot"): delete_election_data_snapshot(snapshot_folder) with ConsoleLogDuration( "### verify_election_consistency using `belenios_tool verify` (#3)" ): verify_election_consistency(self.election_id) with ConsoleLogDuration( "### administrator_starts_tallying_of_election"): self.administrator_starts_tallying_of_election() with ConsoleLogDuration("### trustees_do_partial_decryption"): self.trustees_do_partial_decryption() with ConsoleLogDuration( "### administrator_finishes_tallying_of_election"): self.administrator_finishes_tallying_of_election() with ConsoleLogDuration( "### verify_election_consistency using `belenios_tool verify` (#4)" ): verify_election_consistency(self.election_id)