Beispiel #1
0
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()
Beispiel #2
0
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)