134 lines
5.2 KiB
HTML
134 lines
5.2 KiB
HTML
{% extends templates['booth/base.html'] %}
|
|
|
|
{#
|
|
Eos - Verifiable elections
|
|
Copyright © 2017-18 RunasSudo (Yingtong Li)
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#}
|
|
|
|
{% block content %}
|
|
<div id="cast_prompt">
|
|
<p>Your vote has <span class="superem">not</span> yet been cast. If you have not already done so, please make a note of your ballot fingerprint, <span class="hash">{{ eosjs.eos.core.hashing.__all__.SHA256().update_obj(ballot).hash_as_b64() }}</span>.</p>
|
|
|
|
<div class="ui negative message">
|
|
<p>Your vote has <span class="superem">not</span> yet been cast. Please follow the instructions to continue.</p>
|
|
</div>
|
|
|
|
<p>This election requires you to log in to vote. If you disconnected your internet connection earlier, you must now reconnect it before proceeding.</p>
|
|
|
|
{% if username %}
|
|
<p><span id="booth_logged_in_as">You are currently logged in as {{ username }}.</span> Please select an option from the list below if you would like to switch accounts. Otherwise, click ‘Cast ballot’ to continue.</p>
|
|
{% else %}
|
|
<p><span id="booth_logged_in_as">You are not currently logged in.</a> Please select an option from the list below to log in. Your ballot will be automatically cast once you have logged in.</p>
|
|
{% endif %}
|
|
|
|
<ul class="ui list">
|
|
{% for auth_method in auth_methods %}
|
|
<li><a href="/auth/{{ auth_method[0] }}/login" target="_blank" onclick="login(this);return false;">{{ auth_method[1] }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
|
|
<div class="ui hidden error message" id="error_invalid_id">
|
|
<i class="close icon"></i>
|
|
<div class="header">Error</div>
|
|
<p>The log in details you entered are not valid for this {{ election.kind }}. Please check your username and password and try again. If the issue persists, contact your {{ election.kind }} administrator.</p>
|
|
</div>
|
|
|
|
<div class="ui hidden error message" id="error_unknown">
|
|
<i class="close icon"></i>
|
|
<div class="header">Error</div>
|
|
<p>An unknown error occurred while attempting to cast your ballot. You may click the ‘Cast ballot’ button below to try again. If the issue persists, contact your {{ election.kind }} administrator.</p>
|
|
<p id="error_unknown_tech"></p>
|
|
</div>
|
|
</div>
|
|
<div class="ui basic segment" id="casting" style="display: none; min-height: 4em;">
|
|
<div class="ui active text loader">Casting your ballot. Please wait.</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block buttons %}
|
|
<button class="ui left floated button" onclick="prevTemplate(2);">Back</button>
|
|
<button class="ui right floated primary button" id="cast_button" onclick="castBallot();"{% if not username %} style="display: none;"{% endif %}>Cast ballot</button>
|
|
{% endblock %}
|
|
|
|
{% block after %}
|
|
<script>
|
|
$(".message .close").on("click", function() {
|
|
$(this).closest(".message").addClass("hidden");
|
|
});
|
|
|
|
function login(el) {
|
|
window.open(el.getAttribute("href"), "eos_login_window", "width=400,height=600");
|
|
}
|
|
function callback_complete(username) {
|
|
$("#cast_button").show();
|
|
$("#booth_logged_in_as").text("You are currently logged in as " + username + ".");
|
|
castBallot();
|
|
return true;
|
|
}
|
|
|
|
function castBallot() {
|
|
$("#cast_prompt").hide();
|
|
$("#casting").show();
|
|
|
|
// Prepare ballot
|
|
booth.ballot = booth.ballot.deaudit();
|
|
|
|
$.ajax({
|
|
url: "{{ election_base_url }}cast_ballot",
|
|
type: "POST",
|
|
data: eosjs.eos.core.objects.__all__.EosObject.to_json({
|
|
"ballot": eosjs.eos.core.objects.__all__.EosObject.serialise_and_wrap(booth.ballot, null),
|
|
"fingerprint": booth.fingerprint || null
|
|
}),
|
|
contentType: "application/json",
|
|
dataType: "text"
|
|
})
|
|
.done(function(data) {
|
|
response = eosjs.eos.core.objects.__all__.EosObject.from_json(data);
|
|
booth.voter = eosjs.eos.core.objects.__all__.EosObject.deserialise_and_unwrap(response.voter);
|
|
booth.vote = eosjs.eos.core.objects.__all__.EosObject.deserialise_and_unwrap(response.vote);
|
|
|
|
// Clear plaintexts
|
|
booth.answers = null;
|
|
|
|
nextTemplate();
|
|
})
|
|
.fail(function(xhr, status, err) {
|
|
if (xhr.status === 403) { // Forbidden
|
|
$("#error_invalid_id").removeClass("hidden");
|
|
|
|
$("#error_unknown").addClass("hidden");
|
|
} else {
|
|
if (xhr.responseText && xhr.responseText.length < 100) {
|
|
$("#error_unknown_tech").text("Technical details: " + err + " – " + xhr.responseText);
|
|
} else {
|
|
$("#error_unknown_tech").text("Technical details: " + err);
|
|
}
|
|
$("#error_unknown").removeClass("hidden");
|
|
|
|
$("#error_invalid_id").addClass("hidden");
|
|
}
|
|
|
|
$("#casting").hide();
|
|
$("#cast_prompt").show();
|
|
|
|
console.error(xhr);
|
|
throw err;
|
|
});
|
|
}
|
|
</script>
|
|
{% endblock %}
|