Implement voters in terms of users

This commit is contained in:
RunasSudo 2017-11-26 11:17:28 +11:00
parent 7ea360b5d4
commit f31f5347e2
Signed by: RunasSudo
GPG Key ID: 7234E476BF21C61A
9 changed files with 91 additions and 19 deletions

View File

@ -38,6 +38,7 @@ for f in eos.js_tests; do
# Transcrypt bug # Transcrypt bug
perl -0777 -pi -e 's/property.call \((.*?), \g1.\g1.__impl__(.*?)\)/property.call ($1, $1.__impl__$2)/g' eos/__javascript__/$f.js perl -0777 -pi -e 's/property.call \((.*?), \g1.\g1.__impl__(.*?)\)/property.call ($1, $1.__impl__$2)/g' eos/__javascript__/$f.js
perl -0777 -pi -e 's/property.call \((.*?), \g1.\g1.__implpy_(.*?)\)/property.call ($1, $1.__impl__$2)/g' eos/__javascript__/$f.js
done done
cp eos/__javascript__/eos.js_tests.js eosweb/core/static/js/eosjs.js cp eos/__javascript__/eos.js_tests.js eosweb/core/static/js/eosjs.js

View File

@ -41,11 +41,17 @@ class Vote(EmbeddedObject):
class Voter(EmbeddedObject): class Voter(EmbeddedObject):
_id = UUIDField() _id = UUIDField()
name = StringField()
votes = EmbeddedObjectListField() votes = EmbeddedObjectListField()
class EmailVoter(Voter): class User(EmbeddedObject):
email = StringField() pass
class UserVoter(Voter):
user = EmbeddedObjectField()
@property
def name(self):
return self.user.name
class Question(EmbeddedObject): class Question(EmbeddedObject):
prompt = StringField() prompt = StringField()

View File

@ -26,3 +26,5 @@ import eos.psr.crypto
import eos.psr.election import eos.psr.election
import eos.psr.mixnet import eos.psr.mixnet
import eos.psr.workflow import eos.psr.workflow
import eos.redditauth.election

View File

View File

@ -0,0 +1,31 @@
# Eos - Verifiable elections
# Copyright © 2017 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/>.
from eos.base.election import *
from eos.core.objects import *
class RedditUser(User):
oauth_token = StringField(is_protected=True)
username = StringField()
@property
def name(self):
return self.username
def matched_by(self, other):
if not isinstance(other, RedditUser):
return False
return other.username == self.username

View File

@ -92,11 +92,8 @@ def setup_test_election():
# Set election details # Set election details
election.name = 'Test Election' election.name = 'Test Election'
voter = Voter() from eos.redditauth.election import RedditUser
election.voters.append(Voter(name='Alice')) election.voters.append(UserVoter(user=RedditUser(username='RunasSudo')))
election.voters.append(Voter(name='Bob'))
election.voters.append(Voter(name='Charlie'))
election.voters.append(Voter(name='RunasSudo'))
election.mixing_trustees.append(InternalMixingTrustee(name='Eos Voting')) election.mixing_trustees.append(InternalMixingTrustee(name='Eos Voting'))
election.mixing_trustees.append(InternalMixingTrustee(name='Eos Voting')) election.mixing_trustees.append(InternalMixingTrustee(name='Eos Voting'))
@ -207,7 +204,7 @@ def election_api_cast_vote(election):
voter = None voter = None
for election_voter in election.voters: for election_voter in election.voters:
if election_voter.name == flask.session['user'].username: if election_voter.user.matched_by(flask.session['user']):
voter = election_voter voter = election_voter
break break
@ -223,8 +220,8 @@ def election_api_cast_vote(election):
election.save() election.save()
return flask.Response(json.dumps({ return flask.Response(json.dumps({
'voter': EosObject.serialise_and_wrap(voter), 'voter': EosObject.serialise_and_wrap(voter, should_protect=True),
'vote': EosObject.serialise_and_wrap(vote) 'vote': EosObject.serialise_and_wrap(vote, should_protect=True)
}), mimetype='application/json') }), mimetype='application/json')
@app.route('/debug') @app.route('/debug')

View File

@ -24,9 +24,9 @@
<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> <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 %} {% if username %}
<p>You are currently logged in as {{ username }}. Please select an option from the list below if you would like to switch accounts. Otherwise, click ‘Cast ballot’ to continue.</p> <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 %} {% else %}
<p>You are not currently logged in. Please select an option from the list below to log in. Your ballot will be automatically cast once you have logged in.</p> <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 %} {% endif %}
<ul class="ui list"> <ul class="ui list">
@ -69,6 +69,7 @@
} }
function callback_complete() { function callback_complete() {
$("#cast_button").removeClass("hidden"); $("#cast_button").removeClass("hidden");
$("#booth_logged_in_as").text("You are currently logged in.");
castBallot(); castBallot();
} }
@ -101,7 +102,11 @@
$("#error_unknown").addClass("hidden"); $("#error_unknown").addClass("hidden");
} else { } else {
$("#error_unknown_tech").text("Technical details: " + err + " – " + xhr.responseText); 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_unknown").removeClass("hidden");
$("#error_invalid_id").addClass("hidden"); $("#error_invalid_id").addClass("hidden");
@ -110,6 +115,7 @@
$("#casting").hide(); $("#casting").hide();
$("#cast_prompt").show(); $("#cast_prompt").show();
console.error(xhr);
throw err; throw err;
}); });
} }

View File

@ -0,0 +1,33 @@
{% extends 'semantic_base.html' %}
{#
Eos - Verifiable elections
Copyright © 2017 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 title %}Login{% endblock %}
{% block basecontent %}
<div class="ui middle aligned center aligned grid" style="height: 100%;">
<div class="column" style="max-width: 400px;">
<div class="ui error message">
<div class="header">Log in cancelled</div>
<p>You have cancelled the request to log in to your account.</p>
<p>If you do wish to log in to your account, please close this window and try again.</p>
</div>
</div>
</div>
{% endblock %}

View File

@ -18,15 +18,11 @@ from flask_oauthlib.client import OAuth
import flask import flask
from eos.core.objects import * from eos.redditauth.election import *
import base64 import base64
import uuid import uuid
class RedditUser(DocumentObject):
oauth_token = StringField(is_protected=True)
username = StringField()
def main(app): def main(app):
oauth = OAuth() oauth = OAuth()
reddit = oauth.remote_app('Reddit', reddit = oauth.remote_app('Reddit',