use of com.github.dedis.popstellar.model.objects.Channel in project popstellar by dedis.
the class ElectionHandler method handleElectionSetup.
/**
* Process an ElectionSetup message.
*
* @param context the HandlerContext of the message
* @param electionSetup the message that was received
*/
public static void handleElectionSetup(HandlerContext context, ElectionSetup electionSetup) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
MessageID messageId = context.getMessageId();
if (channel.isLaoChannel()) {
Lao lao = laoRepository.getLaoByChannel(channel);
Log.d(TAG, "handleElectionSetup: channel " + channel + " name " + electionSetup.getName());
Election election = new Election(lao.getId(), electionSetup.getCreation(), electionSetup.getName());
election.setChannel(channel.subChannel(election.getId()));
election.setElectionQuestions(electionSetup.getQuestions());
election.setStart(electionSetup.getStartTime());
election.setEnd(electionSetup.getEndTime());
election.setEventState(OPENED);
// Once the election is created, we subscribe to the election channel
context.getMessageSender().subscribe(election.getChannel()).subscribe();
Log.d(TAG, "election id " + election.getId());
lao.updateElection(election.getId(), election);
lao.updateWitnessMessage(messageId, electionSetupWitnessMessage(messageId, election));
}
}
use of com.github.dedis.popstellar.model.objects.Channel in project popstellar by dedis.
the class ElectionHandler method handleCastVote.
/**
* Process a CastVote message.
*
* @param context the HandlerContext of the message
* @param castVote the message that was received
*/
public static void handleCastVote(HandlerContext context, CastVote castVote) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
MessageID messageId = context.getMessageId();
PublicKey senderPk = context.getSenderPk();
Log.d(TAG, "handleCastVote: channel " + channel);
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
// Verify the vote was created before the end of the election or the election is not closed yet
if (election.getEndTimestamp() >= castVote.getCreation() || election.getState() != CLOSED) {
// Retrieve previous cast vote message stored for the given sender
Optional<MessageID> previousMessageIdOption = election.getMessageMap().entrySet().stream().filter(entry -> senderPk.equals(entry.getValue())).map(Map.Entry::getKey).findFirst();
// Retrieve the creation time of the previous cast vote, if doesn't exist replace with min
// value
long previousMessageCreation = previousMessageIdOption.map(s -> laoRepository.getMessageById().get(s)).map(MessageGeneral::getData).map(CastVote.class::cast).map(CastVote::getCreation).orElse(Long.MIN_VALUE);
// Verify the current cast vote message is the last one received
if (previousMessageCreation <= castVote.getCreation()) {
election.putVotesBySender(senderPk, castVote.getVotes());
election.putSenderByMessageId(senderPk, messageId);
lao.updateElection(election.getId(), election);
}
}
}
use of com.github.dedis.popstellar.model.objects.Channel in project popstellar by dedis.
the class ElectionHandler method handleElectionEnd.
/**
* Process an ElectionEnd message.
*
* @param context the HandlerContext of the message
* @param electionEnd the message that was received
*/
@SuppressWarnings("unused")
public static void handleElectionEnd(HandlerContext context, ElectionEnd electionEnd) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
Log.d(TAG, "handleElectionEnd: channel " + channel);
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
election.setEventState(CLOSED);
lao.updateElection(election.getId(), election);
}
use of com.github.dedis.popstellar.model.objects.Channel in project popstellar by dedis.
the class ElectionHandler method handleElectionResult.
/**
* Process an ElectionResult message.
*
* @param context the HandlerContext of the message
* @param electionResult the message that was received
*/
public static void handleElectionResult(HandlerContext context, ElectionResult electionResult) throws DataHandlingException {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
Log.d(TAG, "handling election result");
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
List<ElectionResultQuestion> resultsQuestions = electionResult.getElectionQuestionResults();
Log.d(TAG, "size of resultsQuestions is " + resultsQuestions.size());
if (resultsQuestions.isEmpty())
throw new DataHandlingException(electionResult, "the questions results is empty");
election.setResults(resultsQuestions);
election.setEventState(RESULTS_READY);
lao.updateElection(election.getId(), election);
}
use of com.github.dedis.popstellar.model.objects.Channel in project popstellar by dedis.
the class LaoHandler method handleStateLao.
/**
* Process a StateLao message.
*
* @param context the HandlerContext of the message
* @param stateLao the message that was received
*/
public static void handleStateLao(HandlerContext context, StateLao stateLao) throws DataHandlingException {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
Log.d(TAG, "Receive State Lao Broadcast msg=" + stateLao);
Lao lao = laoRepository.getLaoByChannel(channel);
Log.d(TAG, "Receive State Lao Broadcast " + stateLao.getName());
if (!laoRepository.getMessageById().containsKey(stateLao.getModificationId())) {
Log.d(TAG, "Can't find modification id : " + stateLao.getModificationId());
// queue it if we haven't received the update message yet
throw new InvalidMessageIdException(stateLao, stateLao.getModificationId());
}
Log.d(TAG, "Verifying signatures");
for (PublicKeySignaturePair pair : stateLao.getModificationSignatures()) {
if (!pair.getWitness().verify(pair.getSignature(), stateLao.getModificationId())) {
throw new InvalidSignatureException(stateLao, pair.getSignature());
}
}
Log.d(TAG, "Success to verify state lao signatures");
// TODO: verify if lao/state_lao is consistent with the lao/update message
lao.setId(stateLao.getId());
lao.setWitnesses(stateLao.getWitnesses());
lao.setName(stateLao.getName());
lao.setLastModified(stateLao.getLastModified());
lao.setModificationId(stateLao.getModificationId());
PublicKey publicKey = context.getKeyManager().getMainPublicKey();
if (lao.getOrganizer().equals(publicKey) || lao.getWitnesses().contains(publicKey)) {
context.getMessageSender().subscribe(lao.getChannel().subChannel("consensus")).subscribe();
}
// Now we're going to remove all pending updates which came prior to this state lao
long targetTime = stateLao.getLastModified();
lao.getPendingUpdates().removeIf(pendingUpdate -> pendingUpdate.getModificationTime() <= targetTime);
laoRepository.updateNodes(channel);
}
Aggregations