Hi folks!
We've determined the cause of these errors.
We see in our application logs that, for some users, an automated process opens the voting link at the same time as the voter does, and then submits the empty voting form before the legitimate voter does. By the time the voter submits their ballot, the empty ballot from the bot has already been recorded, and the voter gets the "already voted" error. This is happening consistently for all the examples of the error that we have individually analyzed.
We don't think this is malicious activity. It appears some email clients are going beyond link prefetching to speed
up page load when a user visits a link from an email, and are now doing
more active crawling of and interacting with links in order to
determine if they are malicious, and they are now going as far as automatically submitting forms. It is difficult to find any conclusive information on how, when or why some email clients are doing this (it makes sense, if this is meant as a security protection, they are playing cat-and-mouse with malicious actors and don't want to disclose their methods). There are some references to these behaviors in
GMail documentation,
user forums, and
Stack Overflow.
We can't control this behavior, as it happens outside of OpaVote, and we have no reliable way to distinguish one of these bots from a legitimate voter. Instead, we are working on an improvement to our Vote page, which will require voters to take an additional action to confirm that they indeed want to submit a fully empty ballot. This will make it harder for legitimate voters to accidentally submit empty ballots, and should prevent automated systems from submitting empty ballots on behalf of users.
We hope to have this fix available before the end of this week.
In the meantime, if you want to run an election and avoid this problem, we suggest having at least one contest where you don't allow an empty vote -- that way fully empty votes will not be accepted for your election, and users will have to actively interact with the ballot before submitting it.
For the computer folks out there, if you're curious, this is what this behavior looks like in our logs:
