Example #1
0
    def message(self, args):
        line = []
        # Üldvorming
        # aeg 14*14DIGIT
        if contains(args, 'timestamp'):
            line = [args['timestamp']]
        else:
            line = [time.strftime("%Y%m%d%H%M%S")]
        # Hääle räsi 28*28BASE64-CHAR
        if not contains(args, 'haal_rasi'):
            if contains(args, 'haal'):
                args['haal_rasi'] = ksum.votehash(args['haal'])
        line.append(args['haal_rasi'])

        # omavalitsuse-number 1*10DIGIT
        line.append(str(args['ringkond_omavalitsus']))
        # suhteline-ringkonna-number 1*10DIGIT
        line.append(str(args['ringkond']))
        # omavalitsuse-number 1*10DIGIT
        line.append(str(args['jaoskond_omavalitsus']))
        # suhteline-valimisjaoskonna-number 1*10DIGIT
        line.append(str(args['jaoskond']))

        if args['tyyp'] in [1, 2, 3]:
            #*1valija-andmed =
            #isikukood 11*11DIGIT
            line.append(str(args['isikukood']))
        if args['tyyp'] == 2:
            # pohjus 1*100UTF-8-CHAR
            line.append(args['pohjus'])
        logstring = "\t".join(line) + "\n"

        return logstring
Example #2
0
    def __handle_valid(self, root, vote_file):

        code = root.split('/').pop()
        user_key = htscommon.get_user_key(code)
        fn = self._reg.path(user_key + [vote_file])

        bdoc = bdocpythonutils.BDocContainer()
        bdoc.load(fn)
        profile = bdocpythonutils.ManifestProfile('TM')
        bdoc.validate(profile)
        haal = bdoc.documents["%s.evote" % self._elid]

        voter = htscommon.get_votefile_voter(vote_file)
        b64haal = base64.b64encode(haal).strip()

        self._log3.log_info(tyyp=3,
                            haal_rasi=ksum.votehash(haal),
                            jaoskond=voter['jaoskond'],
                            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
                            ringkond=voter['ringkond'],
                            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
                            isikukood=code)

        return [
            voter['jaoskond_omavalitsus'], voter['jaoskond'],
            voter['ringkond_omavalitsus'], voter['ringkond'], b64haal
        ]
Example #3
0
    def __handle_valid(self, root, vote_file):

        code = root.split('/').pop()
        user_key = htscommon.get_user_key(code)
        fn = self._reg.path(user_key + [vote_file])

        bdoc = bdocpythonutils.BDocContainer()
        bdoc.load(fn)
        profile = bdocpythonutils.ManifestProfile('TM')
        bdoc.validate(profile)
        haal = bdoc.documents["%s.evote" % self._elid]

        voter = htscommon.get_votefile_voter(vote_file)
        b64haal = base64.b64encode(haal).strip()

        self._log3.log_info(
            tyyp=3,
            haal_rasi=ksum.votehash(haal),
            jaoskond=voter['jaoskond'],
            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
            ringkond=voter['ringkond'],
            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
            isikukood=code)

        return [voter['jaoskond_omavalitsus'], voter['jaoskond'],
            voter['ringkond_omavalitsus'], voter['ringkond'], b64haal]
Example #4
0
    def talleta_haal(self, **args):
        haale_rasi = ksum.votehash(args['vote'])
        user_key = htscommon.get_user_key(args['signercode'])
        self._reg.ensure_key(user_key)
        voter = args['valija']
        vote_file = htscommon.valid_votefile_name(args['timestamp'])
        user_key.append(vote_file)
        filename = self._reg.path(user_key)

        frm = evlog.EvLogFormat()
        logline = frm.logstring(
            tyyp=0,
            haal_rasi=haale_rasi,
            timestamp=args['timestamp'],
            jaoskond=voter['jaoskond'],
            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
            ringkond=voter['ringkond'],
            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
            isikukood=args['signercode'],
            nimi=voter['nimi'],
            reanumber=voter['reanumber'])

        outdata = StringIO.StringIO()
        outzip = zipfile.ZipFile(outdata, 'w')
        outzip.writestr(htscommon.ZIP_BDOCFILE, args['signedvote'])
        outzip.writestr(htscommon.ZIP_LOGFILE, logline)
        outzip.close()
        self._write_atomic(filename, outdata.getvalue())
Example #5
0
    def talleta_haal(self, **args):
        haale_rasi = ksum.votehash(args['vote'])
        user_key = htscommon.get_user_key(args['signercode'])
        self._reg.ensure_key(user_key)
        voter = args['valija']
        vote_file = htscommon.valid_votefile_name(args['timestamp'])
        user_key.append(vote_file)
        filename = self._reg.path(user_key)

        frm = evlog.EvLogFormat()
        logline = frm.logstring(
            tyyp=0,
            haal_rasi=haale_rasi,
            timestamp=args['timestamp'],
            jaoskond=voter['jaoskond'],
            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
            ringkond=voter['ringkond'],
            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
            isikukood=args['signercode'],
            nimi=voter['nimi'],
            reanumber=voter['reanumber'])

        outdata = StringIO.StringIO()
        outzip = zipfile.ZipFile(outdata, 'w')
        outzip.writestr(htscommon.ZIP_BDOCFILE, args['signedvote'])
        outzip.writestr(htscommon.ZIP_LOGFILE, logline)
        outzip.close()
        self._write_atomic(filename, outdata.getvalue())
Example #6
0
    def get_response(self):
        import binascii

        # load a random BDOC from the ones available
        otp_key = htscommon.get_verification_key(self._vote_id)
        elids = self._rreg.read_string_value(otp_key, "elids")\
                .value.rstrip().split("\t")
        bdoc = self.__load_bdoc(random.choice(elids))
        evlog.log("Sending BDOC %s with vote ID %s for verification" %\
                (ksum.votehash(bdoc.get_bytes()), self._vote_id))

        # check consistency
        bdoc_set = set([doc.split(".")[0] for doc in bdoc.documents])
        elids_set = set(elids)
        if bdoc_set != elids_set:
            evlog.log_error("Votes in BDOC for vote ID %s are inconsistent " \
                    "with registry: %s, %s" % (self._vote_id, bdoc_set, elids_set))
            raise HTSVerifyException, evcommon.VERIFY_ERROR

        # create question objects
        questions = []
        for elid in elids:
            questions.append(question.Question(\
                    elid, "hts", Election().get_sub_reg(elid)))

        # start assembling the response
        ret = ""

        # append questions
        for quest in questions:
            ret += quest.qname() + ":" + str(quest.get_type()) + "\t"
        ret += "\n"

        # append election IDs and votes
        for votefile in bdoc.documents:
            elid = votefile.split(".")[0]
            ret += elid + "\t" + binascii.b2a_hex(
                bdoc.documents[votefile]) + "\n"
        ret += "\n"

        # append choices list
        for quest in questions:
            tv = quest.get_voter(self._voter_code)
            if tv:
                ret += quest.choices_to_voter(tv)
            else:
                evlog.log_error("Voter not found")

        self.__decrease_count()
        return ret
Example #7
0
    def get_response(self):
        import binascii

        # load a random BDOC from the ones available
        otp_key = htscommon.get_verification_key(self._vote_id)
        elids = self._rreg.read_string_value(otp_key, "elids")\
                .value.rstrip().split("\t")
        bdoc = self.__load_bdoc(random.choice(elids))
        evlog.log("Sending BDOC %s with vote ID %s for verification" %\
                (ksum.votehash(bdoc.get_bytes()), self._vote_id))

        # check consistency
        bdoc_set = set([doc.split(".")[0] for doc in bdoc.documents])
        elids_set = set(elids)
        if bdoc_set != elids_set:
            evlog.log_error("Votes in BDOC for vote ID %s are inconsistent " \
                    "with registry: %s, %s" % (self._vote_id, bdoc_set, elids_set))
            raise HTSVerifyException, evcommon.VERIFY_ERROR

        # create question objects
        questions = []
        for elid in elids:
            questions.append(question.Question(\
                    elid, "hts", Election().get_sub_reg(elid)))

        # start assembling the response
        ret = ""

        # append questions
        for quest in questions:
            ret += quest.qname() + ":" + str(quest.get_type()) + "\t"
        ret += "\n"

        # append election IDs and votes
        for votefile in bdoc.documents:
            elid = votefile.split(".")[0]
            ret += elid + "\t" + binascii.b2a_hex(bdoc.documents[votefile]) + "\n"
        ret += "\n"

        # append choices list
        for quest in questions:
            tv = quest.get_voter(self._voter_code)
            if tv:
                ret += quest.choices_to_voter(tv)
            else:
                evlog.log_error("Voter not found")

        self.__decrease_count()
        return ret
Example #8
0
    def __tyhista_korduv_haal(self, code, haale_rasi):

        user_key = htscommon.get_user_key(code)
        if not self._reg.check(user_key):
            return

        flist = self._reg.list_keys(user_key)
        for elem in flist:
            if htscommon.VALID_VOTE_PATTERN.match(elem):
                rev_name = htscommon.change_votefile_name(\
                    elem, htscommon.BAUTOREVOKED)
                old_name = self._reg.path(user_key + [elem])
                new_name = self._reg.path(user_key + [rev_name])

                bdoc = bdocpythonutils.BDocContainer()
                bdoc.load(old_name)
                profile = bdocpythonutils.ManifestProfile('TM')
                bdoc.validate(profile)

                vote = bdoc.documents["%s.evote" % self._elid]
                voter = htscommon.get_votefile_voter(elem)
                vote_time = htscommon.get_votefile_time(elem)

                # logimine
                self._log2.log_info(
                    tyyp=2,
                    haal_rasi=ksum.votehash(vote),
                    jaoskond=voter['jaoskond'],
                    jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
                    ringkond=voter['ringkond'],
                    ringkond_omavalitsus=voter['ringkond_omavalitsus'],
                    isikukood=code,
                    pohjus='korduv e-hääl: ' + haale_rasi)
                self._revlog.log_info(
                    tegevus='korduv e-hääl',
                    isikukood=code,
                    nimi=voter['nimi'],
                    timestamp=vote_time,
                    operaator='',
                    pohjus=haale_rasi)

                os.rename(old_name, new_name)
Example #9
0
    def __tyhista_korduv_haal(self, code, haale_rasi):

        user_key = htscommon.get_user_key(code)
        if not self._reg.check(user_key):
            return

        flist = self._reg.list_keys(user_key)
        for elem in flist:
            if htscommon.VALID_VOTE_PATTERN.match(elem):
                rev_name = htscommon.change_votefile_name(\
                    elem, htscommon.BAUTOREVOKED)
                old_name = self._reg.path(user_key + [elem])
                new_name = self._reg.path(user_key + [rev_name])

                bdoc = bdocpythonutils.BDocContainer()
                bdoc.load(old_name)
                profile = bdocpythonutils.ManifestProfile('TM')
                bdoc.validate(profile)

                vote = bdoc.documents["%s.evote" % self._elid]
                voter = htscommon.get_votefile_voter(elem)
                vote_time = htscommon.get_votefile_time(elem)

                # logimine
                self._log2.log_info(
                    tyyp=2,
                    haal_rasi=ksum.votehash(vote),
                    jaoskond=voter['jaoskond'],
                    jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
                    ringkond=voter['ringkond'],
                    ringkond_omavalitsus=voter['ringkond_omavalitsus'],
                    isikukood=code,
                    pohjus='korduv e-hääl: ' + haale_rasi)
                self._revlog.log_info(tegevus='korduv e-hääl',
                                      isikukood=code,
                                      nimi=voter['nimi'],
                                      timestamp=vote_time,
                                      operaator='',
                                      pohjus=haale_rasi)

                os.rename(old_name, new_name)
Example #10
0
    def __talleta(self, binvote):

        store = HTSStore()
        new_otp = False
        try:
            store.verify_vote(binvote)
            evlog.log('Hääle allkirjastaja: %s' % store.signercode)
            store.extract_questions()
            store.create_actions()
            store.revoke_vote_id()
            vote_id = store.issue_vote_id()
            evlog.log("Issued vote ID %s to %s for BDOC %s" % \
                    (vote_id, store.signercode, ksum.votehash(store.signed_vote)))
            new_otp = True
            store.store_votes()
        except HTSStoreException as e:
            evlog.log_error(store.log_msg)
            if new_otp:
                store.revoke_vote_id()
            return e.ret, store.user_msg

        return evcommon.EVOTE_OK, vote_id
Example #11
0
    def talleta_haal(self, **args):

        # Hääle tühistamisel on põhjuseks
        # tühistamise põhjustanud hääle räsi
        haale_rasi = ksum.votehash(args['vote'])
        self.__tyhista_korduv_haal(args['signercode'], haale_rasi)
        user_key = htscommon.get_user_key(args['signercode'])
        self._reg.ensure_key(user_key)
        voter = args['valija']
        vote_file = htscommon.valid_votefile_name(args['timestamp'], voter)
        user_key.append(vote_file)
        filename = self._reg.path(user_key)

        try:
            _f = file(filename, 'w')
            fcntl.lockf(_f, fcntl.LOCK_EX)
            _f.write(args['signedvote'])
            _f.flush()
            _f.close()
        except Exception, (errno, errstr):
            evlog.log_error("Faili '%s' kirjutamine nurjus" % filename)
            raise Exception(errno, errstr)
Example #12
0
    def talleta_haal(self, **args):

        # Hääle tühistamisel on põhjuseks
        # tühistamise põhjustanud hääle räsi
        haale_rasi = ksum.votehash(args['vote'])
        self.__tyhista_korduv_haal(args['signercode'], haale_rasi)
        user_key = htscommon.get_user_key(args['signercode'])
        self._reg.ensure_key(user_key)
        voter = args['valija']
        vote_file = htscommon.valid_votefile_name(args['timestamp'], voter)
        user_key.append(vote_file)
        filename = self._reg.path(user_key)

        try:
            _f = file(filename, 'w')
            fcntl.lockf(_f, fcntl.LOCK_EX)
            _f.write(args['signedvote'])
            _f.flush()
            _f.close()
        except Exception, (errno, errstr):
            evlog.log_error("Faili '%s' kirjutamine nurjus" % filename)
            raise Exception(errno, errstr)
Example #13
0
    def message(self, args):
        line = []
        # Üldvorming
        # aeg 14*14DIGIT
        if contains(args, "timestamp"):
            line = [args["timestamp"]]
        else:
            line = [time.strftime("%Y%m%d%H%M%S")]
        # Hääle räsi 28*28BASE64-CHAR
        if not contains(args, "haal_rasi"):
            if contains(args, "haal"):
                args["haal_rasi"] = ksum.votehash(args["haal"])
        line.append(args["haal_rasi"])

        # omavalitsuse-number 1*10DIGIT
        line.append(str(args["ringkond_omavalitsus"]))
        # suhteline-ringkonna-number 1*10DIGIT
        line.append(str(args["ringkond"]))
        if contains(args, "jaoskond_omavalitsus"):
            # omavalitsuse-number 1*10DIGIT
            line.append(str(args["jaoskond_omavalitsus"]))
        if contains(args, "jaoskond"):
            # suhteline-valimisjaoskonna-number 1*10DIGIT
            line.append(str(args["jaoskond"]))

        if args["tyyp"] in [0, 1, 2, 3]:
            # *1valija-andmed =
            # isikukood 11*11DIGIT
            line.append(str(args["isikukood"]))
        if args["tyyp"] == 2:
            # pohjus 1*100UTF-8-CHAR
            line.append(args["pohjus"])
        if args["tyyp"] == 0:
            line.append(args["nimi"])
            line.append(args["reanumber"])
        logstring = "\t".join(line)

        return logstring
Example #14
0
    def __handle_userrevoked(self, root, vote_file):

        code = root.split('/').pop()
        user_key = htscommon.get_user_key(code)

        fn = self._reg.path(user_key + [vote_file])

        bdoc = bdocpythonutils.BDocContainer()
        bdoc.load(fn)
        profile = bdocpythonutils.ManifestProfile('TM')
        bdoc.validate(profile)
        haal = bdoc.documents["%s.evote" % self._elid]

        voter = htscommon.get_votefile_voter(vote_file)
        pohjus = self._reg.read_string_value(user_key, 'reason').value
        self._log2.log_info(tyyp=2,
                            haal_rasi=ksum.votehash(haal),
                            jaoskond=voter['jaoskond'],
                            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
                            ringkond=voter['ringkond'],
                            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
                            isikukood=code,
                            pohjus=pohjus)
Example #15
0
    def __handle_userrevoked(self, root, vote_file):

        code = root.split('/').pop()
        user_key = htscommon.get_user_key(code)

        fn = self._reg.path(user_key + [vote_file])

        bdoc = bdocpythonutils.BDocContainer()
        bdoc.load(fn)
        profile = bdocpythonutils.ManifestProfile('TM')
        bdoc.validate(profile)
        haal = bdoc.documents["%s.evote" % self._elid]

        voter = htscommon.get_votefile_voter(vote_file)
        pohjus = self._reg.read_string_value(user_key, 'reason').value
        self._log2.log_info(
            tyyp=2,
            haal_rasi=ksum.votehash(haal),
            jaoskond=voter['jaoskond'],
            jaoskond_omavalitsus=voter['jaoskond_omavalitsus'],
            ringkond=voter['ringkond'],
            ringkond_omavalitsus=voter['ringkond_omavalitsus'],
            isikukood=code,
            pohjus=pohjus)