From b0e85dea1259287c8a418823d9c1f11348e4355e Mon Sep 17 00:00:00 2001 From: Erica Portnoy Date: Tue, 13 Feb 2018 17:01:21 -0800 Subject: [PATCH] use backwards-compatible format and implement register --- acme/acme/client.py | 95 +++++++++++++-------------------------------- certbot/client.py | 2 +- certbot/main.py | 4 +- 3 files changed, 29 insertions(+), 72 deletions(-) diff --git a/acme/acme/client.py b/acme/acme/client.py index 99fe95a29..052939be1 100644 --- a/acme/acme/client.py +++ b/acme/acme/client.py @@ -558,16 +558,40 @@ class ClientV2(ClientBase): return self._regr_from_response(response) -class MultiVersionClient(object): +class BackwardsCompatibleClientV2(object): def __init__(self, net, key, server): - directory = messages.Directory.from_json(net.get(server).json()) + self.directory = messages.Directory.from_json(net.get(server).json()) self.acme_version = self._acme_version_from_directory(directory) if self.acme_version == 1: self.client = Client(directory, key=key, net=net) else: self.client = ClientV2(directory, net=net) + def __getattr__(self, name): + if name in dir(ClientBase): + return getattr(self.client, name) + else: + raise AttributeError + + def new_account_and_tos(self, regr=None, tos_cb=None): + def assess_tos(tos): + if tos_cb is not None and not tos_cb(regr.terms_of_service): + raise errors.Error( + "Registration cannot proceed without accepting " + "Terms of Service.") + if self.acme_version == 1: + # if tos in directory + # else if tos not in directory + regr = self.client.register(regr) + if regr.terms_of_service is not None: + assess_tos(regr.terms_of_service) + return self.client.agree_to_tos(regr) + else: + assess_tos(self.directory['termsOfService']) + regr.update(terms_of_service_agreed=True) + return self.client.new_account(regr) + def _acme_version_from_directory(self, directory): try: nonce_field = directory['newNonce'] @@ -575,73 +599,6 @@ class MultiVersionClient(object): return 1 return 2 - def register(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.register(*args, **kwargs) - else: - return self.client.new_account(*args, **kwargs) - - def new_account(self, *args, **kwargs): - return self.register(*args, **kwargs) - - def agree_to_tos(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.agree_to_tos(*args, **kwargs) - - def request_challenges(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.request_challenges(*args, **kwargs) - - def request_domain_challenges(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.request_domain_challenges(*args, **kwargs) - - def request_issuance(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.request_issuance(*args, **kwargs) - - def poll_and_request_issuance(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.poll_and_request_issuance(*args, **kwargs) - - def check_cert(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.check_cert(*args, **kwargs) - - def refresh(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.refresh(*args, **kwargs) - - def fetch_chain(self, *args, **kwargs): - if self.acme_version == 1: - return self.client.fetch_chain(*args, **kwargs) - - ###################### - # Shared methods # - ###################### - - def update_registration(self, *args, **kwargs): - return self.client.update_registration(*args, **kwargs) - - def deactivate_registration(self, *args, **kwargs): - return self.client.deactivate_registration(*args, **kwargs) - - def query_registration(self, *args, **kwargs): - return self.client.query_registration(*args, **kwargs) - - def answer_challenge(self, *args, **kwargs): - return self.client.answer_challenge(*args, **kwargs) - - @classmethod - def retry_after(cls, *args, **kwargs): - return type(cls).retry_after(*args, **kwargs) - - def poll(self, *args, **kwargs): - return self.client.poll(*args, **kwargs) - - def revoke(self, *args, **kwargs): - return self.client.revoke(*args, **kwargs) - class ClientNetwork(object): # pylint: disable=too-many-instance-attributes """Wrapper around requests that signs POSTs for authentication. diff --git a/certbot/client.py b/certbot/client.py index 1848d6fdb..fea6ff7ba 100644 --- a/certbot/client.py +++ b/certbot/client.py @@ -165,7 +165,7 @@ def register(config, account_storage, tos_cb=None): regr = perform_registration(acme, config) if regr.terms_of_service is not None: - if tos_cb is not None and not tos_cb(regr): + if tos_cb is not None and not tos_cb(regr.terms_of_service): raise errors.Error( "Registration cannot proceed without accepting " "Terms of Service.") diff --git a/certbot/main.py b/certbot/main.py index 32dd69256..6e80580c8 100644 --- a/certbot/main.py +++ b/certbot/main.py @@ -495,13 +495,13 @@ def _determine_account(config): if config.email is None and not config.register_unsafely_without_email: config.email = display_ops.get_email() - def _tos_cb(regr): + def _tos_cb(terms_of_service): if config.tos: return True msg = ("Please read the Terms of Service at {0}. You " "must agree in order to register with the ACME " "server at {1}".format( - regr.terms_of_service, config.server)) + terms_of_service, config.server)) obj = zope.component.getUtility(interfaces.IDisplay) return obj.yesno(msg, "Agree", "Cancel", cli_flag="--agree-tos", force_interactive=True)