def test_api_response_string_repr(self): data = MagicMock(spec=str) headers = MagicMock(spec=dict) status_code = MagicMock(spec=int) response = APIResponse(data, headers, status_code) self.assertIn(str(data), str(response)) self.assertIn(str(status_code), str(response))
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock(spec=APIResponse)) public_key = APIResponse(valid_private_key, {"X-IOV-KEY-ID": "59:12:e2:f6:3f:79:d5:1e:18:75:c5:25:ff:b3:b7:f2"}, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time()
def test_api_response_success(self): data = MagicMock(spec=str) headers = MagicMock(spec=dict) status_code = MagicMock(spec=int) response = APIResponse(data, headers, status_code) self.assertEqual(response.data, data) self.assertEqual(response.headers, headers) self.assertEqual(response.status_code, status_code)
def test_process_jose_request_success_empty_response(self): self._transport._http_client = MagicMock() self._transport._http_client.get.return_value = APIResponse(None, {}, 201) response = self._transport._process_jose_request('GET', '/path', 'subject') self._transport.decrypt_response.assert_not_called() self.assertIsInstance(response, APIResponse) self.assertIsNone(response.data) self.assertEqual(response.status_code, 201)
def test_process_jose_request_success_unencrypted_response(self): self._transport._http_client = MagicMock() self._transport._http_client.get.return_value = APIResponse({"a": "response"}, {}, 200) response = self._transport._process_jose_request('GET', '/path', ANY) self._transport.decrypt_response.assert_not_called() self.assertIsInstance(response, APIResponse) self.assertEqual(response.data, {"a": "response"}) self.assertEqual(response.status_code, 200)
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock( spec=APIResponse)) self._transport._get_jwt_signature = MagicMock(return_value='x.x.x') public_key = APIResponse(valid_public_key, {}, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time()
def setUp(self): self._transport = MagicMock() self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._transport.patch.return_value = self._response self._organization_client = OrganizationClient(uuid4(), self._transport)
def setup_client(self, client): self._client = client self._transport = self._client._transport self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._transport.patch.return_value = self._response
def setUp(self): self._transport = MagicMock() self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._transport.patch.return_value = self._response self._directory_client = DirectoryClient(uuid4(), self._transport)
def setUp(self): self._transport = MagicMock() self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._transport.patch.return_value = self._response self._organization_id = uuid4() self._expected_subject = 'org:{}'.format(str(self._organization_id)) self._organization_client = OrganizationClient(self._organization_id, self._transport)
def setUp(self): self._transport = MagicMock() self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._transport.patch.return_value = self._response self._directory_id = uuid4() self._expected_subject = 'dir:{}'.format(str(self._directory_id)) self._directory_client = DirectoryClient(self._directory_id, self._transport)
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock( spec=APIResponse)) public_key = APIResponse(valid_private_key, transport_request_headers, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time() self.issuer = "svc" self.issuer_id = uuid4() self._transport.set_issuer(self.issuer, self.issuer_id, valid_private_key) self._body = str(uuid4()) self._content_hash = '16793293daadb5a03b7cbbb9d15a1a705b22e762a1a751bc8625dec666101ff2' self.jwt_payload = { 'aud': '%s:%s' % (self.issuer, self.issuer_id), 'iss': 'lka', 'cty': 'application/json', 'nbf': time(), 'jti': str(uuid4()), 'exp': time() + 30, 'iat': time(), 'request': { 'meth': 'POST', 'path': '/', 'hash': self._content_hash, 'func': 'S256' }, 'sub': '%s:%s' % (self.issuer, self.issuer_id) } self._transport._get_jwt_payload = MagicMock( return_value=self.jwt_payload) self._transport.content_hash_function = MagicMock() self._transport.content_hash_function( ).hexdigest.return_value = self._content_hash self._jwt_patch = patch("launchkey.transports.jose_auth.JWT", return_value=MagicMock(spec=JWT)).start() self._faux_jwt_headers = { "alg": "RS512", "typ": "JWT", # This should be different than the kid from the transport headers "kid": "ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff" } self._jwt_patch.return_value.unpack.return_value.headers = self._faux_jwt_headers patcher = patch('launchkey.transports.jose_auth.sha256') patched = patcher.start() patched.return_value = MagicMock() patched.return_value.hexdigest.return_value = self._content_hash self.addCleanup(patcher.stop)
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock( spec=APIResponse)) public_key = APIResponse(valid_private_key, {}, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time() self._jwt_patch = patch("launchkey.transports.jose_auth.JWT", return_value=MagicMock(spec=JWT)).start() self._jwt_patch.return_value.unpack.return_value.headers = faux_jwt_headers self.addCleanup(patch.stopall)
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock( spec=APIResponse)) public_key = APIResponse(valid_public_key, transport_request_headers, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time() self.issuer = "svc" self.issuer_id = uuid4() self._transport.set_issuer(self.issuer, self.issuer_id, valid_private_key) self._body = str(uuid4()) self._content_hash = '16793293daadb5a03b7cbbb9d15a1a705b22e762a1a751bc8625dec666101ff2' self._jwt_patch = patch("launchkey.transports.jose_auth.JWT", return_value=MagicMock(spec=JWT)).start() self._jwt_patch.return_value.unpack.return_value.headers = faux_jwt_headers self.jwt_payload = { 'aud': '%s:%s' % (self.issuer, self.issuer_id), 'iss': 'lka', 'cty': 'application/json', 'nbf': time(), 'jti': str(uuid4()), 'exp': time() + 30, 'iat': time(), 'response': { 'status': 200, 'hash': self._content_hash, 'func': 'S256', 'cache': 'expected cache-control', 'location': 'expected location' }, 'sub': '%s:%s' % (self.issuer, self.issuer_id) } self._headers = { 'Location': 'expected location', 'Cache-Control': 'expected cache-control' } self._transport._get_jwt_payload = MagicMock( return_value=self.jwt_payload) self._transport.content_hash_function = MagicMock() self._transport.content_hash_function.return_value.hexdigest.return_value = self._content_hash patcher = patch('launchkey.transports.jose_auth.sha256') patched = patcher.start() patched.return_value = MagicMock() patched.return_value.hexdigest.return_value = self._content_hash self.addCleanup(patcher.stop)
def setUp(self): self._transport = MagicMock() self._response = APIResponse({}, {}, 200) self._transport.post.return_value = self._response self._transport.get.return_value = self._response self._transport.put.return_value = self._response self._transport.delete.return_value = self._response self._device_response = { "auth_request": str(uuid4()), "response": True, "device_id": str(uuid4()), "service_pins": ["1234", "3456", "5678"] } self._transport.loaded_issuer_private_key.decrypt.return_value = dumps( self._device_response) self._service_client = ServiceClient(uuid4(), self._transport) self._service_client._transport._verify_jwt_response = MagicMock()
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock(spec=APIResponse)) public_key = APIResponse(valid_private_key, {"X-IOV-KEY-ID": "59:12:e2:f6:3f:79:d5:1e:18:75:c5:25:ff:b3:b7:f2"}, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time() self.issuer = "svc" self.issuer_id = uuid4() self._transport.set_issuer(self.issuer, self.issuer_id, valid_private_key) self._body = str(uuid4()) self._content_hash = '16793293daadb5a03b7cbbb9d15a1a705b22e762a1a751bc8625dec666101ff2' self.jwt_payload = { 'aud': '%s:%s' % (self.issuer, self.issuer_id), 'iss': 'lka', 'cty': 'application/json', 'nbf': time(), 'jti': str(uuid4()), 'exp': time() + 30, 'iat': time(), 'request': { 'meth': 'POST', 'path': '/', 'hash': self._content_hash, 'func': 'S256'}, 'sub': '%s:%s' % (self.issuer, self.issuer_id) } self._transport._get_jwt_payload = MagicMock(return_value=self.jwt_payload) self._transport.content_hash_function = MagicMock() self._transport.content_hash_function().hexdigest.return_value = self._content_hash patcher = patch('launchkey.transports.jose_auth.sha256') patched = patcher.start() patched.return_value = MagicMock() patched.return_value.hexdigest.return_value = self._content_hash self.addCleanup(patcher.stop)
def setUp(self): self.jti = str(uuid4()) minified_jwt_payload = {"jti": self.jti, "response": {"status": 200}} self._requests_transport = MagicMock(spec=RequestsTransport) self._requests_transport.get.return_value = APIResponse( valid_private_key, {}, 200) self._transport = JOSETransport(http_client=self._requests_transport) self._import_rsa_key_patch = patch( "launchkey.transports.jose_auth.import_rsa_key", return_value=MagicMock(spec=RsaKey)).start() self._jwt_patch = patch("launchkey.transports.jose_auth.JWT", return_value=MagicMock(spec=JWT)).start() self._jwt_patch.return_value.unpack.return_value.headers = faux_jwt_headers self._jws_patch = patch("launchkey.transports.jose_auth.JWS", return_value=MagicMock(spec=JWS)).start() self._jws_patch.return_value.verify_compact.return_value = minified_jwt_payload patch.object(JOSETransport, "_verify_jwt_payload").start() patch.object(JOSETransport, "_verify_jwt_response_headers").start() patch.object(JOSETransport, "_verify_jwt_content_hash").start() self.addCleanup(patch.stopall)
def setUp(self): self._transport = JOSETransport() self._transport.get = MagicMock(return_value=MagicMock( spec=APIResponse)) public_key = APIResponse(valid_private_key, { "X-IOV-KEY-ID": "59:12:e2:f6:3f:79:d5:1e:18:75:c5:25:ff:b3:b7:f2" }, 200) self._transport.get.return_value = public_key self._transport._server_time_difference = 0, time() self.issuer = ANY self.issuer_id = uuid4() self._transport.set_issuer(self.issuer, self.issuer_id, valid_private_key) self._body = str(uuid4()) self._content_hash = '16793293daadb5a03b7cbbb9d15a1a705b22e762a1a751bc8625dec666101ff2' self.jwt_response = { 'aud': '%s:%s' % (self.issuer, self.issuer_id), 'iss': 'lka', 'cty': 'application/json', 'nbf': time(), 'jti': str(uuid4()), 'exp': time() + 30, 'iat': time(), 'response': { 'status': 200, 'hash': self._content_hash, 'func': 'S256' }, 'sub': '%s:%s' % (self.issuer, self.issuer_id) } self._transport._get_jwt_payload = MagicMock( return_value=self.jwt_response) self._transport.content_hash_function = MagicMock() self._transport.content_hash_function( ).hexdigest.return_value = self._content_hash
def test_raises_on_malformed_response_object(self): self._requests_transport.get.return_value = APIResponse(None, {}, 200) with self.assertRaises(UnexpectedAPIResponse): self._transport.verify_jwt_response(MagicMock(), self.jti, ANY, None)
def test_raises_on_api_404(self): self._requests_transport.get.return_value = APIResponse( "Not Found", {}, 404) with self.assertRaises(UnexpectedAPIResponse): self._transport.verify_jwt_response(MagicMock(), self.jti, ANY, None)
def test_validate_response_on_api_response(self): response = APIResponse(MagicMock(), ANY, ANY) self._client._validate_response(response, MagicMock(spec=Schema))
def test_raises_when_kid_header_is_missing_from_http_headers(self): self._requests_transport.get.return_value = APIResponse( valid_public_key, {}, 200) with self.assertRaises(UnexpectedAPIResponse): self._transport.verify_jwt_response(MagicMock(), self.jti, ANY, None)