class Application: def __init__(self): syslog(applicationInit) self.guard = Guard() self.hasher = Pkcs11Wrapper() def computeReply(self, environ, request_body): ret = self.getRequestFromXml(request_body) requestor = self.getIpHash(environ) self.guard.check(requestor, ret) digest = self.hasher.hash((ret.id+ret.mothername).encode()) message = "<hash>{0}</hash>".format(digest).encode() status = okStatus return Reply(status, message) def createErrorReply(self): syslog(traceback.format_exc()) excInfo = sys.exc_info() message = bytes(excAnswer.format(excInfo[1], traceback.format_exc()).encode()) status = notAcceptableStatus return Reply(status, message) def getRequestSize(self, environ): try: request_body_size = int(environ.get('CONTENT_LENGTH', 0)) except (ValueError): request_body_size = 0 return request_body_size def application(self, environ, start_response): request_body_size = self.getRequestSize(environ) request_body = environ['wsgi.input'].read(request_body_size) try: reply = self.computeReply(environ, request_body) except: reply = self.createErrorReply() return reply.webReply(start_response) def getRequestFromXml(self,body): tree = XML(body) if 'request' != tree.tag: raise InputValidationException() r = record() for tag in tree.getchildren(): if tag.tag in ['id','mothername']: setattr(r,tag.tag,tag.text) if None is getattr(r,'id',None): raise InputValidationException() if None is getattr(r,'mothername',None): raise InputValidationException() return r def getIpHash(self,environ): ip=environ["REMOTE_ADDR"] digest = SHA512.SHA512Hash(ip.encode()).hexdigest() return digest def run(self): httpd = make_server('localhost', 8080, self.application) while True: httpd.handle_request()
class GuardTest(unittest.TestCase): def setUp(self): self.guard=Guard() def test_Guard_checks_id_len(self): with self.assertRaises(IncorrectIdException): self.guard.check("aaa",record("1720313399","testname")) def test_Guard_checks_id_sum(self): with self.assertRaises(IncorrectIdException): self.guard.check("aab",record("17203133958","testname")) def test_Guard_checks_id_chars(self): with self.assertRaises(IncorrectIdException): self.guard.check("aac",record("A7203133958","testname")) def test_Guard_check(self): self.guard.check("aaa",record("17203133959","testname")) with self.assertRaises(TooFrequentguestException): self.guard.check("aaa",record("17203133959","testname")) def test_young_people_id(self): self.guard.check("bbb",record("19903146758","testname")) def test_very_young_people_id(self): self.guard.check("ccc",record("40412044075","testname")) def test_mothername_should_not_contain_space(self): with self.assertRaises(IncorrectNameException): self.guard.checkName("contains space") def test_mothername_should_not_contain_anything_beyond_lower_ascii(self): for s in u""" ,?~!"#$%^&*()_+{}:|"<>?öüóőúéáűA\t\n""": name = u"contains%ssomething" % (s, ) with self.assertRaises(IncorrectNameException): self.guard.checkName(name) def test_mothername_should_not_be_too_long(self): with self.assertRaises(IncorrectNameException): self.guard.checkName("c"*51)