def test_render_POST_unexpired_with_qrcode(self): request = DummyRequest([self.pagename]) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.requestHeaders.addRawHeader('Content-Type', 'application/vnd.api+json') request.requestHeaders.addRawHeader('Accept', 'application/vnd.api+json') request.requestHeaders.addRawHeader('X-Forwarded-For', '3.3.3.3') resource = server.CaptchaFetchResource(self.hmacKey, self.publicKey, self.secretKey, self.captchaDir, useForwardedHeader=False) image, challenge = resource.getCaptchaImage(request) data = { 'data': [{ 'id': '2', 'type': 'moat-solution', 'version': server.MOAT_API_VERSION, 'transport': 'obfs4', 'challenge': challenge, 'solution': self.solution, 'qrcode': 'true', }] } encoded_data = json.dumps(data) request = self.create_POST_with_data(encoded_data) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.requestHeaders.addRawHeader('X-Forwarded-For', '3.3.3.3') response = self.resource.render(request) decoded = json.loads(response) self.assertTrue(decoded) self.assertIsNotNone(decoded.get('data')) datas = decoded['data'] self.assertEqual(len(datas), 1) data = datas[0] self.assertIsNotNone(data['qrcode']) self.assertIsNotNone(data['bridges']) self.assertEqual(data['version'], server.MOAT_API_VERSION) self.assertEqual(data['type'], 'moat-bridges') self.assertEqual(data['id'], '3')
def test_createBridgeRequest(self): request = self.create_valid_POST_with_challenge(self.expiredChallenge) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) encoded_content = request.content.read() content = json.loads(encoded_content)['data'][0] bridgeRequest = self.resource.createBridgeRequest('3.3.3.3', content) self.assertTrue(bridgeRequest.isValid())
def test_getBridgeLines_no_data(self): request = self.create_valid_POST_with_challenge(self.expiredChallenge) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) bridgeRequest = self.resource.createBridgeRequest('3.3.3.3', None) bridgelines = self.resource.getBridgeLines(bridgeRequest) self.assertFalse(bridgeRequest.isValid()) self.assertEqual(len(bridgelines), 0)
def test_failureResponse_no_bridges(self): request = self.create_valid_POST_with_challenge(self.expiredChallenge) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) encoded_content = request.content.read() content = json.loads(encoded_content)['data'][0] bridgeRequest = self.resource.createBridgeRequest('3.3.3.3', content) response = self.resource.failureResponse(6, request, bridgeRequest) self.assertIn(b"No bridges available", response)
def test_checkSolution(self): request = self.create_valid_POST_make_new_challenge() request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) clientIP = self.resource.getClientIP(request) encoded_content = request.content.read() content = json.loads(encoded_content)['data'][0] qrcode, transport, challenge, solution = self.resource.extractClientSolution( content) result = self.resource.checkSolution(challenge, solution, clientIP) self.assertTrue(result)
def createRequestWithIPs(self): """Set the IP address returned from ``request.getClientIP()`` to '3.3.3.3', and the IP address reported in the 'X-Forwarded-For' header to '2.2.2.2'. """ request = DummyRequest(['']) request.headers.update({'x-forwarded-for': '2.2.2.2'}) # See :api:`twisted.test.requesthelper.DummyRequest.getClientIP` request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.method = b'GET' return request
def create_valid_POST_make_new_challenge(self): request = DummyRequest([self.pagename]) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.requestHeaders.addRawHeader('Content-Type', 'application/vnd.api+json') request.requestHeaders.addRawHeader('Accept', 'application/vnd.api+json') request.requestHeaders.addRawHeader('X-Forwarded-For', '3.3.3.3') resource = server.CaptchaFetchResource(self.hmacKey, self.publicKey, self.secretKey, self.captchaDir, useForwardedHeader=False) image, challenge = resource.getCaptchaImage(request) request = self.create_valid_POST_with_challenge(challenge) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.requestHeaders.addRawHeader('X-Forwarded-For', '3.3.3.3') return request
def test_render_POST_ascii(self): """Calling ``CSPResource.render_POST()`` should log whatever stuff was sent in the body of the POST request. """ self.request.method = b'POST' self.request.writeContent('lah dee dah') self.request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) resource = server.CSPResource() page = resource.render_POST(self.request) self.assertIn('<html>', str(page))
def test_render_POST_unicode(self): """Calling ``CSPResource.render_POST()`` should log whatever stuff was sent in the body of the POST request, even if it's unicode. """ self.request.method = b'POST' self.request.writeContent(('南京大屠杀是中国抗日战争初期侵华日军在中华民国首都南京犯下的' '大規模屠殺、強姦以及纵火、抢劫等战争罪行与反人类罪行。')) self.request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) resource = server.CSPResource() page = resource.render_POST(self.request) self.assertIn('<html>', str(page))
def createRequestWithIPs(self): """Set the IP address returned from ``request.getClientIP()`` to '3.3.3.3', and the IP address reported in the 'X-Forwarded-For' header to '2.2.2.2'. """ request = DummyRequest([self.pagename]) # Since we do not set ``request.getClientIP`` here like we do in some # of the other unittests, an exception would be raised here if # ``getBridgesForRequest()`` is unable to get the IP address from this # 'X-Forwarded-For' header (because ``ip`` would get set to ``None``). request.headers.update({'x-forwarded-for': '2.2.2.2'}) # See :api:`twisted.test.requesthelper.DummyRequest.getClientIP` request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) request.method = b'GET' return request
def test_render_POST_expired(self): request = self.create_valid_POST_with_challenge(self.expiredChallenge) request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443) response = self.resource.render(request) decoded = json.loads(response) self.assertTrue(decoded) self.assertIsNotNone(decoded.get('errors')) errors = decoded['errors'] self.assertEqual(len(errors), 1) error = errors[0] self.assertEqual(error['status'], "No You're A Teapot") self.assertEqual(error['code'], 419) self.assertEqual(error['detail'], "The CAPTCHA solution was incorrect.") self.assertEqual(error['version'], server.MOAT_API_VERSION) self.assertEqual(error['type'], "moat-bridges") self.assertEqual(error['id'], '4')