Search in sources :

Example 1 with Channel

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));
    }
}
Also used : Channel(com.github.dedis.popstellar.model.objects.Channel) LAORepository(com.github.dedis.popstellar.repository.LAORepository) Lao(com.github.dedis.popstellar.model.objects.Lao) Election(com.github.dedis.popstellar.model.objects.Election) MessageID(com.github.dedis.popstellar.model.objects.security.MessageID)

Example 2 with Channel

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);
        }
    }
}
Also used : PublicKey(com.github.dedis.popstellar.model.objects.security.PublicKey) Channel(com.github.dedis.popstellar.model.objects.Channel) LAORepository(com.github.dedis.popstellar.repository.LAORepository) CastVote(com.github.dedis.popstellar.model.network.method.message.data.election.CastVote) Lao(com.github.dedis.popstellar.model.objects.Lao) Election(com.github.dedis.popstellar.model.objects.Election) Map(java.util.Map) MessageID(com.github.dedis.popstellar.model.objects.security.MessageID)

Example 3 with Channel

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);
}
Also used : Channel(com.github.dedis.popstellar.model.objects.Channel) LAORepository(com.github.dedis.popstellar.repository.LAORepository) Lao(com.github.dedis.popstellar.model.objects.Lao) Election(com.github.dedis.popstellar.model.objects.Election)

Example 4 with Channel

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);
}
Also used : Channel(com.github.dedis.popstellar.model.objects.Channel) LAORepository(com.github.dedis.popstellar.repository.LAORepository) Lao(com.github.dedis.popstellar.model.objects.Lao) ElectionResultQuestion(com.github.dedis.popstellar.model.network.method.message.data.election.ElectionResultQuestion) DataHandlingException(com.github.dedis.popstellar.utility.error.DataHandlingException) Election(com.github.dedis.popstellar.model.objects.Election)

Example 5 with Channel

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);
}
Also used : InvalidSignatureException(com.github.dedis.popstellar.utility.error.InvalidSignatureException) PublicKey(com.github.dedis.popstellar.model.objects.security.PublicKey) Channel(com.github.dedis.popstellar.model.objects.Channel) LAORepository(com.github.dedis.popstellar.repository.LAORepository) InvalidMessageIdException(com.github.dedis.popstellar.utility.error.InvalidMessageIdException) StateLao(com.github.dedis.popstellar.model.network.method.message.data.lao.StateLao) CreateLao(com.github.dedis.popstellar.model.network.method.message.data.lao.CreateLao) Lao(com.github.dedis.popstellar.model.objects.Lao) UpdateLao(com.github.dedis.popstellar.model.network.method.message.data.lao.UpdateLao) PublicKeySignaturePair(com.github.dedis.popstellar.model.network.method.message.PublicKeySignaturePair)

Aggregations

Channel (com.github.dedis.popstellar.model.objects.Channel)39 Lao (com.github.dedis.popstellar.model.objects.Lao)30 LAORepository (com.github.dedis.popstellar.repository.LAORepository)28 Disposable (io.reactivex.disposables.Disposable)19 CompositeDisposable (io.reactivex.disposables.CompositeDisposable)17 MessageGeneral (com.github.dedis.popstellar.model.network.method.message.MessageGeneral)16 StateLao (com.github.dedis.popstellar.model.network.method.message.data.lao.StateLao)14 UpdateLao (com.github.dedis.popstellar.model.network.method.message.data.lao.UpdateLao)14 KeyPair (com.github.dedis.popstellar.model.objects.security.KeyPair)13 CreateLao (com.github.dedis.popstellar.model.network.method.message.data.lao.CreateLao)10 GenericMessage (com.github.dedis.popstellar.model.network.GenericMessage)8 Error (com.github.dedis.popstellar.model.network.answer.Error)8 ResultMessages (com.github.dedis.popstellar.model.network.answer.ResultMessages)8 Catchup (com.github.dedis.popstellar.model.network.method.Catchup)8 Publish (com.github.dedis.popstellar.model.network.method.Publish)8 Query (com.github.dedis.popstellar.model.network.method.Query)8 Subscribe (com.github.dedis.popstellar.model.network.method.Subscribe)8 Unsubscribe (com.github.dedis.popstellar.model.network.method.Unsubscribe)8 Data (com.github.dedis.popstellar.model.network.method.message.data.Data)8 JsonRPCErrorException (com.github.dedis.popstellar.utility.error.JsonRPCErrorException)8