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 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())
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]
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 ]
def _count_votes(self, elid): user_key = htscommon.get_user_key(self.signercode) if Election().get_sub_reg(elid).check(user_key): keys = Election().get_sub_reg(elid).list_keys(user_key) try: keys.remove(htscommon.VOTE_VERIFICATION_ID_FILENAME) except ValueError: pass # No "otp" file return len(keys) return 0
def purge_otp(reg, otp): otp_key = htscommon.get_verification_key(otp) voter = reg.read_string_value(otp_key, "voter").value.rstrip() voter_key = htscommon.get_user_key(voter) elids = reg.read_string_value(otp_key, "elids").value.rstrip().split("\t") for elid in elids: sreg = Election().get_sub_reg(elid) if sreg.check(voter_key + [htscommon.VOTE_VERIFICATION_ID_FILENAME]): sreg.delete_value(voter_key, htscommon.VOTE_VERIFICATION_ID_FILENAME) reg.ensure_no_key(otp_key)
def __kylm_ennistamine(self, input_list, good_list, bad_list, action_list): for el in input_list: code = el[0] if not self.haaletanud(code): bad_list.append(el) evlog.log_error('Isik koodiga %s ei ole hääletanud' % code) continue user_key = htscommon.get_user_key(code) vc = htscommon.VoteCounter() revoked_key = '' for vote_file in self._reg.list_keys(user_key): if htscommon.VALID_VOTE_PATTERN.match(vote_file): vc.inc_valid() elif htscommon.USERREVOKED_VOTE_PATTERN.match(vote_file): vc.inc_userrevoked() revoked_key = vote_file elif htscommon.AUTOREVOKED_VOTE_PATTERN.match(vote_file): pass elif htscommon.REVOKE_REASON_PATTERN.match(vote_file): pass else: vc.inc_unknown() if ((vc.userrevoked() == 0) or (vc.valid() > 0)): bad_list.append(el) evlog.log_error(\ 'Isik koodiga %s ei ole oma häält tühistanud' % code) continue if (vc.userrevoked() > 1): self._errmsg = 'Serveri andmestruktuurid ei ole kooskõlalised' raise Exception(self._errmsg) if (vc.unknown() > 0): self._errmsg = 'Tundmatu viga häälte tühistamisel' raise Exception(self._errmsg) if (vc.userrevoked() == 1): valid_key = \ htscommon.change_votefile_name(\ revoked_key, htscommon.BVALID) act = ActionInfo() act.set_old_name(self._reg.path(user_key + [revoked_key])) act.set_new_name(self._reg.path(user_key + [valid_key])) act.set_reason_name(self._reg.path(user_key + ['reason'])) act.set_timestamp(htscommon.get_votefile_time(revoked_key)) act.set_code(el[0]) act.set_name(el[1]) act.set_reason(el[2]) good_list.append(el) action_list.append(act)
def __kylm_tyhistamine(self, input_list, good_list, bad_list, action_list): for el in input_list: code = el[0] if not self.haaletanud(code): bad_list.append(el) evlog.log_error('Isik koodiga %s ei ole hääletanud' % code) continue user_key = htscommon.get_user_key(code) vc = htscommon.VoteCounter() valid_key = '' for vote_file in self._reg.list_keys(user_key): if htscommon.VALID_VOTE_PATTERN.match(vote_file): vc.inc_valid() valid_key = vote_file elif htscommon.USERREVOKED_VOTE_PATTERN.match(vote_file): vc.inc_userrevoked() elif htscommon.AUTOREVOKED_VOTE_PATTERN.match(vote_file): pass elif htscommon.REVOKE_REASON_PATTERN.match(vote_file): pass else: vc.inc_unknown() if (vc.valid() > 1): self._errmsg = 'Serveri andmestruktuurid ei ole kooskõlalised' raise Exception(self._errmsg) if ((vc.valid() == 0) or (vc.userrevoked() > 0)): bad_list.append(el) evlog.log_error(\ 'Kasutaja isikukoodiga %s hääl on juba tühistatud' % \ code) if (vc.unknown() > 0): self._errmsg = 'Tundmatu viga häälte tühistamisel' raise Exception(self._errmsg) if (vc.valid() == 1): revoked_key = \ htscommon.change_votefile_name(\ valid_key, htscommon.BUSERREVOKED) act = ActionInfo() act.set_old_name(self._reg.path(user_key + [valid_key])) act.set_new_name(self._reg.path(user_key + [revoked_key])) act.set_reason_name(self._reg.path(user_key)) act.set_timestamp(htscommon.get_votefile_time(valid_key)) act.set_code(el[0]) act.set_name(el[1]) act.set_reason(el[2]) good_list.append(el) action_list.append(act)
def purge_otp(otp_key): elec = election.Election() reg = elec.get_root_reg() voter = reg.read_string_value(otp_key, "voter").value.rstrip() voter_key = htscommon.get_user_key(voter) elids = reg.read_string_value(otp_key, "elids").value.rstrip().split("\t") for elid in elids: sreg = elec.get_sub_reg(elid) if sreg.check(voter_key + [htscommon.VOTE_VERIFICATION_ID_FILENAME]): sreg.delete_value(voter_key, htscommon.VOTE_VERIFICATION_ID_FILENAME) reg.ensure_no_key(otp_key)
def __kylm_tyhistamine(self, input_list, good_list, bad_list, action_list): for el in input_list: code = el[0] if not self.haaletanud(code): bad_list.append(el) evlog.log_error("Isik koodiga %s ei ole hääletanud" % code) continue user_key = htscommon.get_user_key(code) vc = htscommon.VoteCounter() valid_key = "" for vote_file in self._reg.list_keys(user_key): if htscommon.VALID_VOTE_PATTERN.match(vote_file): vc.inc_valid() valid_key = vote_file elif htscommon.USERREVOKED_VOTE_PATTERN.match(vote_file): vc.inc_userrevoked() elif htscommon.AUTOREVOKED_VOTE_PATTERN.match(vote_file): pass elif htscommon.REVOKE_REASON_PATTERN.match(vote_file): pass elif htscommon.VOTE_VERIFICATION_ID_FILENAME == vote_file: pass else: vc.inc_unknown() if vc.valid() > 1: self._errmsg = "Serveri andmestruktuurid ei ole kooskõlalised" raise Exception(self._errmsg) if (vc.valid() == 0) or (vc.userrevoked() > 0): bad_list.append(el) evlog.log_error("Kasutaja isikukoodiga %s hääl on juba tühistatud" % code) if vc.unknown() > 0: self._errmsg = "Tundmatu viga häälte tühistamisel" raise Exception(self._errmsg) if vc.valid() == 1: revoked_key = htscommon.change_votefile_name(valid_key, htscommon.BUSERREVOKED) act = ActionInfo() act.set_old_name(self._reg.path(user_key + [valid_key])) act.set_new_name(self._reg.path(user_key + [revoked_key])) act.set_reason_name(self._reg.path(user_key)) act.set_timestamp(htscommon.get_votefile_time(valid_key)) act.set_code(el[0]) act.set_name(el[1]) act.set_reason(el[2]) good_list.append(el) action_list.append(act)
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 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 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 get_vote_for_result(self, logline, fname): res = None try: elems = logline.split('\t') code = elems[6] user_key = htscommon.get_user_key(code) fn = self._reg.path(user_key + [fname]) bdoc = htsbase.get_vote(fn) if bdoc: haal = bdoc.documents["%s.evote" % self._elid] voter = htscommon.get_logline_voter(logline) b64haal = base64.b64encode(haal).strip() res = [voter['jaoskond_omavalitsus'], voter['jaoskond'], \ voter['ringkond_omavalitsus'], voter['ringkond'], b64haal] except: evlog.log_exception() return res
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
def _revoke_vote_id(voter_code): elec = Election() otps = set() for quest in elec.get_questions(): reg = elec.get_sub_reg(quest) key = htscommon.get_user_key(voter_code) if reg.check(key + [htscommon.VOTE_VERIFICATION_ID_FILENAME]): otp = reg.read_string_value(key, \ htscommon.VOTE_VERIFICATION_ID_FILENAME) otps.add(otp.value) evlog.log("Revoking vote ID %s" % otp) if not _delete_vote_id(otp.value): evlog.log_error("No such vote-ID: %s" % otp) otp.delete() if len(otps) > 1: evlog.log_error("The voter %s had multiple vote ID-s: %s" % \ (voter_code, ", ".join(otps)))
def get_vote_for_result(self, logline, fname): res = None try: elems = logline.split('\t') code = elems[6] user_key = htscommon.get_user_key(code) fn = self._reg.path(user_key + [fname]) bdoc = htsbase.get_vote(fn) if bdoc: haal = bdoc.documents["%s.evote" % self._elid] voter = htscommon.get_logline_voter(logline) b64haal = base64.b64encode(haal).strip() res = [voter['jaoskond_omavalitsus'], voter['jaoskond'], voter['ringkond_omavalitsus'], voter['ringkond'], b64haal] except: evlog.log_exception() return res
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
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)
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)
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)
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)
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)
def issue_vote_id(self): vote_id = self.__create_vote_key() rreg = Election().get_root_reg() key = htscommon.get_verification_key(vote_id) rreg.create_string_value(key, "voter", self.signercode) rreg.create_integer_value(key, "timestamp", int(time.time())) rreg.create_integer_value(key, "count", \ Election().get_verification_count()) # Store the election IDs and include a backreference in the # corresponding questions' subregistries. elids = "" for elid in [quest[0] for quest in self.questions]: elids += elid + "\t" sreg = Election().get_sub_reg(elid) skey = htscommon.get_user_key(self.signercode) sreg.ensure_key(skey) sreg.create_string_value(skey, \ htscommon.VOTE_VERIFICATION_ID_FILENAME, vote_id) rreg.create_string_value(key, "elids", elids) return vote_id
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 get_revoked_path(self, pc): user_key = htscommon.get_user_key(pc) return self._reg.path(user_key + ['reason'])