ACME: default to new_authzr_uri form Directory

This commit is contained in:
Jakub Warmuz
2016-01-10 18:01:58 +00:00
parent 3cddb15023
commit 31a64a0e9f
2 changed files with 35 additions and 18 deletions
+11 -10
View File
@@ -181,40 +181,41 @@ class Client(object): # pylint: disable=too-many-instance-attributes
raise errors.UnexpectedUpdate(authzr) raise errors.UnexpectedUpdate(authzr)
return authzr return authzr
def request_challenges(self, identifier, new_authzr_uri): def request_challenges(self, identifier, new_authzr_uri=None):
"""Request challenges. """Request challenges.
:param identifier: Identifier to be challenged. :param .messages.Identifier identifier: Identifier to be challenged.
:type identifier: `.messages.Identifier` :param str new_authzr_uri: ``new-authorization`` URI. If omitted,
will default to value found in ``directory``.
:param str new_authzr_uri: new-authorization URI
:returns: Authorization Resource. :returns: Authorization Resource.
:rtype: `.AuthorizationResource` :rtype: `.AuthorizationResource`
""" """
new_authz = messages.NewAuthorization(identifier=identifier) new_authz = messages.NewAuthorization(identifier=identifier)
response = self.net.post(new_authzr_uri, new_authz) response = self.net.post(self.directory.new_authz
if new_authzr_uri is None else new_authzr_uri,
new_authz)
# TODO: handle errors # TODO: handle errors
assert response.status_code == http_client.CREATED assert response.status_code == http_client.CREATED
return self._authzr_from_response(response, identifier) return self._authzr_from_response(response, identifier)
def request_domain_challenges(self, domain, new_authz_uri): def request_domain_challenges(self, domain, new_authzr_uri=None):
"""Request challenges for domain names. """Request challenges for domain names.
This is simply a convenience function that wraps around This is simply a convenience function that wraps around
`request_challenges`, but works with domain names instead of `request_challenges`, but works with domain names instead of
generic identifiers. generic identifiers. See ``request_challenges`` for more
documentation.
:param str domain: Domain name to be challenged. :param str domain: Domain name to be challenged.
:param str new_authzr_uri: new-authorization URI
:returns: Authorization Resource. :returns: Authorization Resource.
:rtype: `.AuthorizationResource` :rtype: `.AuthorizationResource`
""" """
return self.request_challenges(messages.Identifier( return self.request_challenges(messages.Identifier(
typ=messages.IDENTIFIER_FQDN, value=domain), new_authz_uri) typ=messages.IDENTIFIER_FQDN, value=domain), new_authzr_uri)
def answer_challenge(self, challb, response): def answer_challenge(self, challb, response):
"""Answer challenge. """Answer challenge.
+24 -8
View File
@@ -36,6 +36,7 @@ class ClientTest(unittest.TestCase):
self.directory = messages.Directory({ self.directory = messages.Directory({
messages.NewRegistration: 'https://www.letsencrypt-demo.org/acme/new-reg', messages.NewRegistration: 'https://www.letsencrypt-demo.org/acme/new-reg',
messages.Revocation: 'https://www.letsencrypt-demo.org/acme/revoke-cert', messages.Revocation: 'https://www.letsencrypt-demo.org/acme/revoke-cert',
messages.NewAuthorization: 'https://www.letsencrypt-demo.org/acme/new-authz',
}) })
from acme.client import Client from acme.client import Client
@@ -133,7 +134,7 @@ class ClientTest(unittest.TestCase):
regr = self.client.update_registration.call_args[0][0] regr = self.client.update_registration.call_args[0][0]
self.assertEqual(self.regr.terms_of_service, regr.body.agreement) self.assertEqual(self.regr.terms_of_service, regr.body.agreement)
def test_request_challenges(self): def _prepare_response_for_request_challenges(self):
self.response.status_code = http_client.CREATED self.response.status_code = http_client.CREATED
self.response.headers['Location'] = self.authzr.uri self.response.headers['Location'] = self.authzr.uri
self.response.json.return_value = self.authz.to_json() self.response.json.return_value = self.authz.to_json()
@@ -141,10 +142,20 @@ class ClientTest(unittest.TestCase):
'next': {'url': self.authzr.new_cert_uri}, 'next': {'url': self.authzr.new_cert_uri},
} }
self.client.request_challenges(self.identifier, self.authzr.uri) def test_request_challenges(self):
# TODO: test POST call arguments self._prepare_response_for_request_challenges()
self.client.request_challenges(self.identifier)
self.net.post.assert_called_once_with(
self.directory.new_authz,
messages.NewAuthorization(identifier=self.identifier))
# TODO: split here and separate test def test_requets_challenges_custom_uri(self):
self._prepare_response_for_request_challenges()
self.client.request_challenges(self.identifier, 'URI')
self.net.post.assert_called_once_with('URI', mock.ANY)
def test_request_challenges_unexpected_update(self):
self._prepare_response_for_request_challenges()
self.response.json.return_value = self.authz.update( self.response.json.return_value = self.authz.update(
identifier=self.identifier.update(value='foo')).to_json() identifier=self.identifier.update(value='foo')).to_json()
self.assertRaises( self.assertRaises(
@@ -153,15 +164,20 @@ class ClientTest(unittest.TestCase):
def test_request_challenges_missing_next(self): def test_request_challenges_missing_next(self):
self.response.status_code = http_client.CREATED self.response.status_code = http_client.CREATED
self.assertRaises( self.assertRaises(errors.ClientError, self.client.request_challenges,
errors.ClientError, self.client.request_challenges, self.identifier)
self.identifier, self.regr)
def test_request_domain_challenges(self): def test_request_domain_challenges(self):
self.client.request_challenges = mock.MagicMock() self.client.request_challenges = mock.MagicMock()
self.assertEqual( self.assertEqual(
self.client.request_challenges(self.identifier), self.client.request_challenges(self.identifier),
self.client.request_domain_challenges('example.com', self.regr)) self.client.request_domain_challenges('example.com'))
def test_request_domain_challenges_custom_uri(self):
self.client.request_challenges = mock.MagicMock()
self.assertEqual(
self.client.request_challenges(self.identifier, 'URI'),
self.client.request_domain_challenges('example.com', 'URI'))
def test_answer_challenge(self): def test_answer_challenge(self):
self.response.links['up'] = {'url': self.challr.authzr_uri} self.response.links['up'] = {'url': self.challr.authzr_uri}