Example #1
0
def main_function():
    if len(sys.argv) != 3:
        usage()

    el_id = sys.argv[1]
    _if = sys.argv[2]

    if not check_file(_if):
        print "Faili " + _if + " ei eksisteeri"
        sys.exit(1)

    if not ksum.has(_if):
        print "Faili " + ksum.filename(_if) + " ei eksisteeri"
        sys.exit(1)

    if not ksum.check(_if):
        print "Kontrollsumma ei klapi"
        sys.exit(1)

    reg = Election().get_sub_reg(el_id)
    reg.ensure_key(['hlr', 'input'])
    dst = reg.path(['hlr', 'input', 'votes'])
    os.system("cp " + _if + " " + dst)
    os.system("cp " + ksum.filename(_if) + " " + ksum.filename(dst))
    Election().config_hlr_input_elid_done(el_id)
Example #2
0
def add_hts_files_to_table(elid, table):
    import os
    reg = Election().get_root_reg()
    if reg.check(['questions', elid, 'hts', 'output']):
        o_files = os.listdir(reg.path(['questions', elid, 'hts', 'output']))
        for of in o_files:
            if of.find("tokend.") == 0 and of.find(".sha1") == -1:
                table.add_file(EvFile(of, of, ['questions', elid, 'hts', 'output']))
Example #3
0
def add_hts_files_to_table(elid, table):
    import os
    reg = Election().get_root_reg()
    if reg.check(['questions', elid, 'hts', 'output']):
        o_files = os.listdir(reg.path(['questions', elid, 'hts', 'output']))
        for of in o_files:
            if of.find("tokend.") == 0 and of.find(".sha1") == -1:
                table.add_file(
                    EvFile(of, of, ['questions', elid, 'hts', 'output']))
Example #4
0
class HTSBase:

    def __init__(self, elid):
        self._elid = elid
        self._errmsg = None
        self._reg = Election().get_sub_reg(self._elid)

        self._log1 = evlog.Logger()
        self._log1.set_format(evlog.EvLogFormat())
        self._log1.set_logs(self._reg.path(['common', 'log1']))

        self._log2 = evlog.Logger()
        self._log2.set_format(evlog.EvLogFormat())
        self._log2.set_logs(self._reg.path(['common', 'log2']))

        self._log3 = evlog.Logger()
        self._log3.set_format(evlog.EvLogFormat())
        self._log3.set_logs(self._reg.path(['common', 'log3']))

        self._revlog = evlog.Logger()
        self._revlog.set_format(evlog.RevLogFormat())
        self._revlog.set_logs(self._reg.path(['common', evcommon.REVLOG_FILE]))

    def _haaletanud_konf(self, isikukood):
        user_key = htscommon.get_user_key(isikukood)
        return self._reg.check(user_key) and \
                len(self._reg.list_keys(user_key)) > 0

    def haaletanud(self, isikukood):
        logi = self._log1.contains(isikukood)
        konf = self._haaletanud_konf(isikukood)
        if logi and konf:
            return True
        if (not logi) and (not konf):
            return False
        self._errmsg = 'Logifail LOG1 ja serveri olek ei ole kooskõlalised'
        raise Exception(self._errmsg)
Example #5
0
class EvFile:
    def __init__(self, filename, uiname, regprefix):
        self.__filename = filename
        self.__uiname = uiname
        self.__regprefix = regprefix
        self.__reg = Election().get_root_reg()

    def exists(self):
        return self.__reg.check(self.__regprefix + [self.__filename])

    def path(self):
        return self.__reg.path(self.__regprefix + [self.__filename])

    def name(self):
        return self.__uiname
Example #6
0
class EvFile:

    def __init__(self, filename, uiname, regprefix):
        self.__filename = filename
        self.__uiname = uiname
        self.__regprefix = regprefix
        self.__reg = Election().get_root_reg()

    def exists(self):
        return self.__reg.check(self.__regprefix + [self.__filename])

    def path(self):
        return self.__reg.path(self.__regprefix + [self.__filename])

    def name(self):
        return self.__uiname
Example #7
0
def main_function():
    if len(sys.argv) != 3:
        usage()

    el_id = sys.argv[1]
    _if = sys.argv[2]

    if not ksum.check(_if, True):
        print "Kontrollsumma ei klapi"
        sys.exit(1)

    reg = Election().get_sub_reg(el_id)
    reg.ensure_key(['hlr', 'input'])
    dst = reg.path(['hlr', 'input', 'votes'])
    shutil.copy(_if, dst)
    ksum.store(dst)
    Election().config_hlr_input_elid_done(el_id)
Example #8
0
def main_function():
    if len(sys.argv) != 3:
        usage()

    el_id = sys.argv[1]
    _if = sys.argv[2]

    if not ksum.check(_if, True):
        print "Kontrollsumma ei klapi"
        sys.exit(1)

    reg = Election().get_sub_reg(el_id)
    reg.ensure_key(['hlr', 'input'])
    dst = reg.path(['hlr', 'input', 'votes'])
    shutil.copy(_if, dst)
    ksum.store(dst)
    Election().config_hlr_input_elid_done(el_id)
Example #9
0
    def __load_bdoc(self, elid):
        voter_key = htscommon.get_user_key(self._voter_code)
        sreg = Election().get_sub_reg(elid)
        for votefile in sreg.list_keys(voter_key):
            if htscommon.VALID_VOTE_PATTERN.match(votefile):
                bdoc = bdocpythonutils.BDocContainer()
                bdoc.load(sreg.path(voter_key + [votefile]))
                bdoc.validate(bdocpythonutils.ManifestProfile("TM"))

                self._voter = htscommon.get_votefile_voter(votefile)
                break

        if not bdoc:
            evlog.log_error("No valid BDOC found for voter %s using vote ID %s" % \
                    (self._voter, self._vote_id))
            raise HTSVerifyException, evcommon.VERIFY_ERROR

        return bdoc
Example #10
0
    def __load_bdoc(self, elid):
        voter_key = htscommon.get_user_key(self._voter_code)
        sreg = Election().get_sub_reg(elid)
        vote_files = []
        for vfile in sreg.list_keys(voter_key):
            if htscommon.VALID_VOTE_PATTERN.match(vfile):
                vote_files.append(vfile)

        vote_files.sort()
        latest = vote_files.pop()
        if latest:
            bdoc = htsbase.get_vote(sreg.path(voter_key + [latest]))

        if not bdoc:
            evlog.log_error("No valid BDOC found for voter %s using vote ID %s" % \
                    (self._voter_code, self._vote_id))
            raise HTSVerifyException, evcommon.VERIFY_ERROR

        return bdoc
Example #11
0
    def __load_bdoc(self, elid):
        voter_key = htscommon.get_user_key(self._voter_code)
        sreg = Election().get_sub_reg(elid)
        vote_files = []
        for vfile in sreg.list_keys(voter_key):
            if htscommon.VALID_VOTE_PATTERN.match(vfile):
                vote_files.append(vfile)

        vote_files.sort()
        latest = vote_files.pop()
        if latest:
            bdoc = htsbase.get_vote(sreg.path(voter_key + [latest]))

        if not bdoc:
            evlog.log_error("No valid BDOC found for voter %s using vote ID %s" % \
                    (self._voter_code, self._vote_id))
            raise HTSVerifyException, evcommon.VERIFY_ERROR

        return bdoc
Example #12
0
class HLR:
    """
    Häältelugemisrakendus
    """
    def __init__(self, elid, tmpdir):

        self._elid = elid
        evlog.AppLog().set_app('HLR', self._elid)
        self._reg = Election().get_sub_reg(self._elid)
        self._log4 = evlog.Logger('log4')
        self._log5 = evlog.Logger('log5')
        self._log4.set_format(evlog.EvLogFormat())
        self._log5.set_format(evlog.EvLogFormat())
        self._log4.set_logs(self._reg.path(['common', 'log4']))
        self._log5.set_logs(self._reg.path(['common', 'log5']))

        tmpreg = evreg.Registry(root=tmpdir)
        tmpreg.ensure_key([])
        tmpreg.delete_sub_keys([])
        self.output_file = tmpreg.path(['decrypted_votes'])
        self.decrypt_prog = DECRYPT_PROGRAM
        self.sign_prog = SIGN_PROGRAM
        self.__cnt = ChoicesCounter()

    def __del__(self):
        try:
            os.remove(self.output_file)
        except:
            pass

    def _decrypt_votes(self, pin):

        input_file = self._reg.path(['hlr', 'input', 'votes'])
        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [input_file, self.output_file, \
            token_name, priv_key_label, pin, pkcs11lib]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.decrypt_prog] + args)
        except OSError, oserr:
            errstr = "Häälte faili '%s' dekrüpteerimine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_DECRYPT_ERRORS:
                errstr2 = G_DECRYPT_ERRORS[exit_code]

            errstr = \
                "Häälte faili '%s' dekrüpteerimine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Häälte faili '%s' dekrüpteerimine nurjus (signaal %d)" % \
                (input_file, exit_code)
        evlog.log_error(errstr)
        return False
Example #13
0
class HLR:
    """
    Häältelugemisrakendus
    """

    def __init__(self, elid, tmpdir):

        self._elid = elid
        evlog.AppLog().set_app('HLR', self._elid)
        self._reg = Election().get_sub_reg(self._elid)
        self._log4 = evlog.Logger('log4')
        self._log5 = evlog.Logger('log5')
        self._log4.set_format(evlog.EvLogFormat())
        self._log5.set_format(evlog.EvLogFormat())
        self._log4.set_logs(self._reg.path(['common', 'log4']))
        self._log5.set_logs(self._reg.path(['common', 'log5']))

        tmpreg = evreg.Registry(root=tmpdir)
        tmpreg.ensure_key([])
        tmpreg.delete_sub_keys([])
        self.output_file = tmpreg.path(['decrypted_votes'])
        self.decrypt_prog = DECRYPT_PROGRAM
        self.sign_prog = SIGN_PROGRAM
        self.__cnt = ChoicesCounter()

    def __del__(self):
        try:
            os.remove(self.output_file)
        except:
            pass

    def _decrypt_votes(self, pin):

        input_file = self._reg.path(['hlr', 'input', 'votes'])
        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [input_file, self.output_file, \
            token_name, priv_key_label, pin, pkcs11lib]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.decrypt_prog] + args)
        except OSError, oserr:
            errstr = "Häälte faili '%s' dekrüpteerimine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_DECRYPT_ERRORS:
                errstr2 = G_DECRYPT_ERRORS[exit_code]

            errstr = \
                "Häälte faili '%s' dekrüpteerimine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Häälte faili '%s' dekrüpteerimine nurjus (signaal %d)" % \
                (input_file, exit_code)
        evlog.log_error(errstr)
        return False
Example #14
0
class HLR:
    """
    Häältelugemisrakendus
    """
    def __init__(self, elid, tmpdir):

        self._elid = elid
        evlog.AppLog().set_app('HLR', self._elid)
        self._reg = Election().get_sub_reg(self._elid)
        self._log4 = evlog.Logger('log4')
        self._log5 = evlog.Logger('log5')
        self._log4.set_format(evlog.EvLogFormat())
        self._log5.set_format(evlog.EvLogFormat())
        self._log4.set_logs(self._reg.path(['common', 'log4']))
        self._log5.set_logs(self._reg.path(['common', 'log5']))

        tmpreg = evreg.Registry(root=tmpdir)
        tmpreg.ensure_key([])
        tmpreg.delete_sub_keys([])
        self.output_file = tmpreg.path(['decrypted_votes'])
        self.decrypt_prog = DECRYPT_PROGRAM
        self.sign_prog = SIGN_PROGRAM
        self.__cnt = ChoicesCounter()

    def __del__(self):
        try:
            os.remove(self.output_file)
        except:
            pass

    def _decrypt_votes(self, pin):

        input_file = self._reg.path(['hlr', 'input', 'votes'])
        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [
            input_file, self.output_file, token_name, priv_key_label, pin,
            pkcs11lib
        ]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.decrypt_prog] + args)
        except OSError as oserr:
            errstr = "Häälte faili '%s' dekrüpteerimine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_DECRYPT_ERRORS:
                errstr2 = G_DECRYPT_ERRORS[exit_code]

            errstr = \
                "Häälte faili '%s' dekrüpteerimine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Häälte faili '%s' dekrüpteerimine nurjus (signaal %d)" % \
            (input_file, exit_code)
        evlog.log_error(errstr)
        return False

    def _sign_result(self, pin, input_file):

        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [
            input_file,
            _sig(input_file), token_name, priv_key_label, pin, pkcs11lib
        ]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.sign_prog] + args)
        except OSError as oserr:
            errstr = "Tulemuste faili '%s' allkirjastamine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_SIGN_ERRORS:
                errstr2 = G_SIGN_ERRORS[exit_code]

            errstr = \
                "Tulemuste faili '%s' allkirjastamine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Tulemuste faili '%s' allkirjastamine nurjus (signaal %d)" % \
            (input_file, exit_code)
        evlog.log_error(errstr)
        return False

    def _sign_result_files(self, pin):
        f1 = self._reg.path(['hlr', 'output', evcommon.ELECTIONRESULT_FILE])
        f2 = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_STAT_FILE])

        ret1 = self._sign_result(pin, f1)
        ret2 = self._sign_result(pin, f2)

        if (ret1 and ret2):
            import zipfile
            zippath = self._reg.path(
                ['hlr', 'output', evcommon.ELECTIONRESULT_ZIP_FILE])
            rzip = zipfile.ZipFile(zippath, "w")
            rzip.write(f1, evcommon.ELECTIONRESULT_FILE)
            rzip.write(_sig(f1), _sig(evcommon.ELECTIONRESULT_FILE))
            rzip.write(f2, evcommon.ELECTIONRESULT_STAT_FILE)
            rzip.write(_sig(f2), _sig(evcommon.ELECTIONRESULT_STAT_FILE))

            if os.path.isfile(CERT_PATH) and os.access(CERT_PATH, os.R_OK):
                rzip.write(CERT_PATH, CERT)

            if os.path.isfile(README_PATH) and os.access(README_PATH, os.R_OK):
                rzip.write(README_PATH, README)

            rzip.close()
            return True
        else:
            return False

    def _add_kehtetu(self, ringkond, district):
        self.__cnt.add_vote(ringkond, district, ringkond[0] + ".kehtetu")

    def _check_vote(self, ringkond, district, haal, line_nr):

        ret = True
        if haal == CORRUPTED_VOTE:
            errstr = "Häält (rida=%d) ei õnnestunud dekrüptida" % line_nr
            evlog.log_error(errstr)
            ret = False
        else:
            lst = haal.split('\n')
            if ((len(lst) != 4) or (lst[0] != evcommon.VERSION)
                    or (lst[1] != self._elid) or (lst[3] != "")):
                ret = False
            else:
                if not formatutil.is_valiku_kood(lst[2]):
                    ret = False
                elif lst[2].split(".")[0] != ringkond[0]:
                    ret = False

        if ret and self.__cnt.has_choice(ringkond, district, lst[2]):
            self.__cnt.add_vote(ringkond, district, lst[2])
        else:
            ret = False
            self._add_kehtetu(ringkond, district)

        return ret

    def handle_vote(self, votelst, line_nr):
        try:
            dist = (votelst[0], votelst[1])
            ring = (votelst[2], votelst[3])
            vote = base64.decodestring(votelst[5])
            if not self._check_vote(ring, dist, vote, line_nr):
                self._log4.log_info(tyyp=4,
                                    haal=base64.decodestring(votelst[4]),
                                    ringkond_omavalitsus=votelst[2],
                                    ringkond=votelst[3])
            else:
                self._log5.log_info(tyyp=5,
                                    haal=base64.decodestring(votelst[4]),
                                    ringkond_omavalitsus=votelst[2],
                                    ringkond=votelst[3])
            return True
        except:
            evlog.log_exception()
            return False

    def _count_votes(self):
        dvl = DecodedVoteList(self, self.__cnt)
        dvl.attach_logger(evlog.AppLog())
        dvl.attach_elid(self._elid)
        if not dvl.check_format(self.output_file, 'Loen hääli: '):
            evlog.log_error('Häälte lugemine ebaõnnestus')
            return False
        return True

    def _write_result(self):
        result_dist_fn = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_FILE])
        out_f = file(result_dist_fn, 'w')
        out_f.write(evcommon.VERSION + '\n' + self._elid + '\n')
        self.__cnt.outputdist(out_f)
        out_f.close()
        ksum.store(result_dist_fn)

        result_stat_fn = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_STAT_FILE])
        out_f = file(result_stat_fn, 'w')
        out_f.write(evcommon.VERSION + '\n' + self._elid + '\n')
        self.__cnt.outputstat(out_f)
        out_f.close()
        ksum.store(result_stat_fn)

        print "Hääled (%d) on loetud." % self.__cnt.count()

    def _check_logs(self):
        log_lines = 0
        log_lines = log_lines + self._log4.lines_in_file()
        log_lines = log_lines + self._log5.lines_in_file()
        # remove header
        log_lines = log_lines - 6
        if log_lines != self.__cnt.count():
            errstr = "Log4 ja Log5 ridade arv (%d) "\
                "ei klapi häälte arvuga (%d)" % \
                (log_lines, self.__cnt.count())
            evlog.log_error(errstr)
            return False
        return True

    def _create_logs(self):

        with open(self._reg.path(['common', 'log4']), 'w') as log4_f:
            log4_f.write(evcommon.VERSION + "\n")
            log4_f.write(self._elid + "\n")
            log4_f.write("4\n")

        with open(self._reg.path(['common', 'log5']), 'w') as log5_f:
            log5_f.write(evcommon.VERSION + "\n")
            log5_f.write(self._elid + "\n")
            log5_f.write("5\n")
        return True

    def run(self, pin):
        try:
            self.__cnt.load(self._reg)
            if not self._decrypt_votes(pin):
                return False
            if not self._create_logs():
                return False
            if not self._count_votes():
                return False
            self._write_result()
            if not self._check_logs():
                return False
            if not self._sign_result_files(pin):
                return False
            return True
        except:
            evlog.log_exception()
            return False
Example #15
0
class HTSBase:

    def __init__(self, elid):
        self._elid = elid
        self._errmsg = None
        self._reg = Election().get_sub_reg(self._elid)

        self._revlog = evlog.Logger()
        self._revlog.set_format(evlog.RevLogFormat())
        self._revlog.set_logs(self._reg.path(['common', evcommon.REVLOG_FILE]))

    def haaletanud(self, isikukood):
        latest = self.get_latest_vote(isikukood)
        return latest is not None

    def get_revoked_path(self, pc):
        user_key = htscommon.get_user_key(pc)
        return self._reg.path(user_key + ['reason'])

    def get_latest_vote(self, pc):
        user_key = htscommon.get_user_key(pc)
        if self._reg.check(user_key):
            files = self._reg.list_keys(user_key)
            votes = []
            for el in files:
                if htscommon.VALID_VOTE_PATTERN.match(el):
                    votes.append(el)
            votes.sort()
            latest = votes.pop()
            if latest:
                return htscommon.get_votefile_time(latest)

        return None

    def restore_vote(self, revline, operator):
        timest = self.get_latest_vote(revline[0])
        os.unlink(self.get_revoked_path(revline[0]))
        self._revlog.log_info(
            tegevus='ennistamine',
            isikukood=revline[0],
            nimi=revline[1],
            timestamp=timest,
            operaator=operator,
            pohjus=revline[2])

    def revoke_vote(self, revline, operator):
        timest = self.get_latest_vote(revline[0])
        nowstr = time.strftime("%Y%m%d%H%M%S", time.localtime())
        self._reg.create_string_value(
            htscommon.get_user_key(revline[0]), 'reason',
            "%s\t%s" % (nowstr, revline[2]))

        self._revlog.log_info(
            tegevus='tühistamine',
            testtime=nowstr,
            isikukood=revline[0],
            nimi=revline[1],
            timestamp=timest,
            operaator=operator,
            pohjus=revline[2])

    def is_user_revoked(self, pc):
        user_key = htscommon.get_user_key(pc)
        if self._reg.check(user_key + ['reason']):
            line = self._reg.read_string_value(user_key, 'reason').value
            data = line.split('\t')
            return True, data[1], data[0]
        return False, '', ''

    def save_log(self, lines, log):
        fn = self._reg.path(['common', 'log%s' % log])
        lf = htscommon.LoggedFile(fn)
        lf.open('w')
        lf.write(evcommon.VERSION + "\n")
        lf.write(self._elid + "\n")
        lf.write("%s\n" % log)
        for el in lines:
            lf.write(el + '\n')
        lf.close()

    def save_revocation_report(self, report):
        fn = self._reg.path(['hts', 'output', evcommon.REVREPORT_FILE])
        outfile = htscommon.LoggedFile(fn)
        outfile.open('a')
        for el in report:
            outfile.write("\t".join(el) + "\n")

        outfile.close()

    def talletaja(self, ik):
        vl = None
        try:
            vl = inputlists.VotersList('hts', self._reg)
            if not vl.has_voter(ik):
                return None
            ret = vl.get_voter(ik)
            return ret
        finally:
            if vl is not None:
                vl.close()
                vl = None
Example #16
0
def main_function():

    try:

        if Election().is_hes():
            server = 'hes'
        elif Election().is_hts():
            server = 'hts'
        else:
            raise Exception('Vigane serveri tüüp')

        election_ids = Election().get_questions()

        if len(election_ids) == 0:
            print "Valijanimekirju pole laaditud"
        else:
            election_ids.sort()
            for el_i in election_ids:
                print "%s" % el_i
                reg_i = Election().get_sub_reg(el_i, [server])
                if not reg_i.check(['voters_files']):
                    print "\tValijanimekirju pole laaditud"
                    continue

                file_list = reg_i.list_keys(['voters_files'])
                file_list.sort()
                if len(file_list) == 0:
                    print "\tValijanimekirju pole laaditud"
                else:
                    prefix_len = 8 + 1 + 14 + 1
                    j = 1
                    added_total = 0
                    for vf_i in file_list:
                        file_date = vf_i[0:4] + "." + vf_i[4:6] + \
                            "." + vf_i[6:8] + " " + vf_i[8:10] + \
                            ":" + vf_i[10:12] + ":" + vf_i[12:14]
                        file_name = vf_i[15:]
                        if len(file_name) > prefix_len:
                            file_name = file_name[prefix_len:]
                        print "\t%02d. %s - %s" % (j, file_date, file_name)
                        j += 1

                        # nimekirja kokkulugemine
                        _rf = file(reg_i.path(['voters_files', vf_i]), "r")
                        line = _rf.readline()      # päise 1. rida
                        line = _rf.readline()      # päise 2. rida
                        filetype = _rf.readline()  # päise 3. rida
                        added = 0
                        removed = 0
                        while 1:
                            line = _rf.readline()
                            if len(line) == 0:
                                break
                            fields = line.split("\t")
                            if fields[2] == "lisamine":
                                added += 1
                                added_total += 1
                            else:
                                removed += 1
                                added_total -= 1
                        print \
                            "\t    Faili tüüp: %s\n" % filetype.strip() + \
                            "\t    Lisamisi %d, " % added + \
                                  "eemaldamisi %d\n" % removed + \
                            "\t    Kokku peale laadimist: %d" % added_total

    except Exception, ex:
        print 'Viga valijanimekirjade uuenduste ajaloo kuvamisel: ' + str(ex)
        sys.exit(1)
Example #17
0
class HTSBase:
    def __init__(self, elid):
        self._elid = elid
        self._errmsg = None
        self._reg = Election().get_sub_reg(self._elid)

        self._revlog = evlog.Logger()
        self._revlog.set_format(evlog.RevLogFormat())
        self._revlog.set_logs(self._reg.path(['common', evcommon.REVLOG_FILE]))

    def haaletanud(self, isikukood):
        latest = self.get_latest_vote(isikukood)
        return latest <> None

    def get_revoked_path(self, pc):
        user_key = htscommon.get_user_key(pc)
        return self._reg.path(user_key + ['reason'])

    def get_latest_vote(self, pc):
        user_key = htscommon.get_user_key(pc)
        if self._reg.check(user_key):
            files = self._reg.list_keys(user_key)
            votes = []
            for el in files:
                if htscommon.VALID_VOTE_PATTERN.match(el):
                    votes.append(el)
            votes.sort()
            latest = votes.pop()
            if latest:
                return htscommon.get_votefile_time(latest)

        return None

    def restore_vote(self, revline, operator):
        timest = self.get_latest_vote(revline[0])
        os.unlink(self.get_revoked_path(revline[0]))
        self._revlog.log_info(tegevus='ennistamine',
                              isikukood=revline[0],
                              nimi=revline[1],
                              timestamp=timest,
                              operaator=operator,
                              pohjus=revline[2])

    def revoke_vote(self, revline, operator):
        timest = self.get_latest_vote(revline[0])
        nowstr = time.strftime("%Y%m%d%H%M%S", time.localtime())
        self._reg.create_string_value(\
            htscommon.get_user_key(revline[0]), 'reason', \
            "%s\t%s" % (nowstr, revline[2]))

        self._revlog.log_info(tegevus='tühistamine',
                              testtime=nowstr,
                              isikukood=revline[0],
                              nimi=revline[1],
                              timestamp=timest,
                              operaator=operator,
                              pohjus=revline[2])

    def is_user_revoked(self, pc):
        user_key = htscommon.get_user_key(pc)
        if self._reg.check(user_key + ['reason']):
            line = self._reg.read_string_value(user_key, 'reason').value
            data = line.split('\t')
            return True, data[1], data[0]
        return False, '', ''

    def save_log(self, lines, log):
        fn = self._reg.path(['common', 'log%s' % log])
        lf = htscommon.LoggedFile(fn)
        lf.open('w')
        lf.write(evcommon.VERSION + "\n")
        lf.write(self._elid + "\n")
        lf.write("%s\n" % log)
        for el in lines:
            lf.write(el + '\n')
        lf.close()

    def save_revocation_report(self, report):
        fn = self._reg.path(['hts', 'output', evcommon.REVREPORT_FILE])
        outfile = htscommon.LoggedFile(fn)
        outfile.open('a')
        for el in report:
            outfile.write("\t".join(el) + "\n")

        outfile.close()

    def talletaja(self, ik):
        vl = None
        try:
            vl = inputlists.VotersList('hts', self._reg)
            if not vl.has_voter(ik):
                return None
            ret = vl.get_voter(ik)
            return ret
        finally:
            if vl != None:
                vl.close()
                vl = None
Example #18
0
class HLR:

    """
    Häältelugemisrakendus
    """

    def __init__(self, elid, tmpdir):

        self._elid = elid
        evlog.AppLog().set_app('HLR', self._elid)
        self._reg = Election().get_sub_reg(self._elid)
        self._log4 = evlog.Logger('log4')
        self._log5 = evlog.Logger('log5')
        self._log4.set_format(evlog.EvLogFormat())
        self._log5.set_format(evlog.EvLogFormat())
        self._log4.set_logs(self._reg.path(['common', 'log4']))
        self._log5.set_logs(self._reg.path(['common', 'log5']))

        tmpreg = evreg.Registry(root=tmpdir)
        tmpreg.ensure_key([])
        tmpreg.delete_sub_keys([])
        self.output_file = tmpreg.path(['decrypted_votes'])
        self.decrypt_prog = DECRYPT_PROGRAM
        self.sign_prog = SIGN_PROGRAM
        self.__cnt = ChoicesCounter()

    def __del__(self):
        try:
            os.remove(self.output_file)
        except:
            pass

    def _decrypt_votes(self, pin):

        input_file = self._reg.path(['hlr', 'input', 'votes'])
        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [input_file,
                self.output_file,
                token_name,
                priv_key_label,
                pin,
                pkcs11lib]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.decrypt_prog] + args)
        except OSError as oserr:
            errstr = "Häälte faili '%s' dekrüpteerimine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_DECRYPT_ERRORS:
                errstr2 = G_DECRYPT_ERRORS[exit_code]

            errstr = \
                "Häälte faili '%s' dekrüpteerimine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Häälte faili '%s' dekrüpteerimine nurjus (signaal %d)" % \
            (input_file, exit_code)
        evlog.log_error(errstr)
        return False

    def _sign_result(self, pin, input_file):

        token_name = Election().get_hsm_token_name()
        priv_key_label = Election().get_hsm_priv_key()
        pkcs11lib = Election().get_pkcs11_path()
        args = [input_file,
                _sig(input_file),
                token_name,
                priv_key_label,
                pin,
                pkcs11lib]

        exit_code = 0

        try:
            exit_code = subprocess.call([self.sign_prog] + args)
        except OSError as oserr:
            errstr = "Tulemuste faili '%s' allkirjastamine nurjus: %s" % \
                (input_file, oserr)
            evlog.log_error(errstr)
            return False

        if exit_code == 0:
            return True

        if exit_code > 0:
            errstr2 = "Tundmatu viga"
            if exit_code in G_SIGN_ERRORS:
                errstr2 = G_SIGN_ERRORS[exit_code]

            errstr = \
                "Tulemuste faili '%s' allkirjastamine nurjus: %s (kood %d)" % \
                (input_file, errstr2, exit_code)
            evlog.log_error(errstr)
            return False

        errstr = "Tulemuste faili '%s' allkirjastamine nurjus (signaal %d)" % \
            (input_file, exit_code)
        evlog.log_error(errstr)
        return False

    def _sign_result_files(self, pin):
        f1 = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_FILE])
        f2 = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_STAT_FILE])

        ret1 = self._sign_result(pin, f1)
        ret2 = self._sign_result(pin, f2)

        if (ret1 and ret2):
            import zipfile
            zippath = self._reg.path(
                ['hlr', 'output', evcommon.ELECTIONRESULT_ZIP_FILE])
            rzip = zipfile.ZipFile(zippath, "w")
            rzip.write(f1, evcommon.ELECTIONRESULT_FILE)
            rzip.write(_sig(f1), _sig(evcommon.ELECTIONRESULT_FILE))
            rzip.write(f2, evcommon.ELECTIONRESULT_STAT_FILE)
            rzip.write(_sig(f2), _sig(evcommon.ELECTIONRESULT_STAT_FILE))

            if os.path.isfile(CERT_PATH) and os.access(CERT_PATH, os.R_OK):
                rzip.write(CERT_PATH, CERT)

            if os.path.isfile(README_PATH) and os.access(README_PATH, os.R_OK):
                rzip.write(README_PATH, README)

            rzip.close()
            return True
        else:
            return False

    def _add_kehtetu(self, ringkond, district):
        self.__cnt.add_vote(ringkond, district, ringkond[0] + ".kehtetu")

    def _check_vote(self, ringkond, district, haal, line_nr):

        ret = True
        if haal == CORRUPTED_VOTE:
            errstr = "Häält (rida=%d) ei õnnestunud dekrüptida" % line_nr
            evlog.log_error(errstr)
            ret = False
        else:
            lst = haal.split('\n')
            if ((len(lst) != 4) or
                    (lst[0] != evcommon.VERSION) or
                    (lst[1] != self._elid) or
                    (lst[3] != "")):
                ret = False
            else:
                if not formatutil.is_valiku_kood(lst[2]):
                    ret = False
                elif lst[2].split(".")[0] != ringkond[0]:
                    ret = False

        if ret and self.__cnt.has_choice(ringkond, district, lst[2]):
            self.__cnt.add_vote(ringkond, district, lst[2])
        else:
            ret = False
            self._add_kehtetu(ringkond, district)

        return ret

    def handle_vote(self, votelst, line_nr):
        try:
            dist = (votelst[0], votelst[1])
            ring = (votelst[2], votelst[3])
            vote = base64.decodestring(votelst[5])
            if not self._check_vote(ring, dist, vote, line_nr):
                self._log4.log_info(
                    tyyp=4,
                    haal=base64.decodestring(votelst[4]),
                    ringkond_omavalitsus=votelst[2],
                    ringkond=votelst[3])
            else:
                self._log5.log_info(
                    tyyp=5,
                    haal=base64.decodestring(votelst[4]),
                    ringkond_omavalitsus=votelst[2],
                    ringkond=votelst[3])
            return True
        except:
            evlog.log_exception()
            return False

    def _count_votes(self):
        dvl = DecodedVoteList(self, self.__cnt)
        dvl.attach_logger(evlog.AppLog())
        dvl.attach_elid(self._elid)
        if not dvl.check_format(self.output_file, 'Loen hääli: '):
            evlog.log_error('Häälte lugemine ebaõnnestus')
            return False
        return True

    def _write_result(self):
        result_dist_fn = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_FILE])
        out_f = file(result_dist_fn, 'w')
        out_f.write(evcommon.VERSION + '\n' + self._elid + '\n')
        self.__cnt.outputdist(out_f)
        out_f.close()
        ksum.store(result_dist_fn)

        result_stat_fn = self._reg.path(
            ['hlr', 'output', evcommon.ELECTIONRESULT_STAT_FILE])
        out_f = file(result_stat_fn, 'w')
        out_f.write(evcommon.VERSION + '\n' + self._elid + '\n')
        self.__cnt.outputstat(out_f)
        out_f.close()
        ksum.store(result_stat_fn)

        print "Hääled (%d) on loetud." % self.__cnt.count()

    def _check_logs(self):
        log_lines = 0
        log_lines = log_lines + self._log4.lines_in_file()
        log_lines = log_lines + self._log5.lines_in_file()
        # remove header
        log_lines = log_lines - 6
        if log_lines != self.__cnt.count():
            errstr = "Log4 ja Log5 ridade arv (%d) "\
                "ei klapi häälte arvuga (%d)" % \
                (log_lines, self.__cnt.count())
            evlog.log_error(errstr)
            return False
        return True

    def _create_logs(self):

        with open(self._reg.path(['common', 'log4']), 'w') as log4_f:
            log4_f.write(evcommon.VERSION + "\n")
            log4_f.write(self._elid + "\n")
            log4_f.write("4\n")

        with open(self._reg.path(['common', 'log5']), 'w') as log5_f:
            log5_f.write(evcommon.VERSION + "\n")
            log5_f.write(self._elid + "\n")
            log5_f.write("5\n")
        return True

    def run(self, pin):
        try:
            self.__cnt.load(self._reg)
            if not self._decrypt_votes(pin):
                return False
            if not self._create_logs():
                return False
            if not self._count_votes():
                return False
            self._write_result()
            if not self._check_logs():
                return False
            if not self._sign_result_files(pin):
                return False
            return True
        except:
            evlog.log_exception()
            return False