diff --git a/acme/acme/client.py b/acme/acme/client.py index 5d623265e..b8b145720 100644 --- a/acme/acme/client.py +++ b/acme/acme/client.py @@ -49,6 +49,7 @@ class Client(object): # pylint: disable=too-many-instance-attributes :ivar messages.Directory directory: :ivar key: `.JWK` (private) :ivar account: `.Account` (private) + :ivar acme_version: `int` (private) :ivar alg: `.JWASignature` :ivar bool verify_ssl: Verify SSL certificates? :ivar .ClientNetwork net: Client network. Useful for testing. If not @@ -58,8 +59,8 @@ class Client(object): # pylint: disable=too-many-instance-attributes """ # pylint: disable=too-many-arguments - def __init__(self, directory, key, account=None, alg=jose.RS256, verify_ssl=True, - net=None): + def __init__(self, directory, key, account=None, acme_version=1, alg=jose.RS256, + verify_ssl=True, net=None): """Initialize. :param directory: Directory Resource (`.messages.Directory`) or @@ -68,8 +69,9 @@ class Client(object): # pylint: disable=too-many-instance-attributes """ self.key = key self.account = account - self.net = ClientNetwork(key, account=account, alg=alg, - verify_ssl=verify_ssl) if net is None else net + self.acme_version = acme_version + self.net = ClientNetwork(key, account=account, acme_version=acme_version, + alg=alg, verify_ssl=verify_ssl) if net is None else net if isinstance(directory, six.string_types): self.directory = messages.Directory.from_json( @@ -90,16 +92,20 @@ class Client(object): # pylint: disable=too-many-instance-attributes def register(self, new_reg=None): """Register. - :param .NewRegistration new_reg: + :param .NewRegistration or .NewAccount new_reg: :returns: Registration Resource. :rtype: `.RegistrationResource` """ - new_reg = messages.NewRegistration() if new_reg is None else new_reg - assert isinstance(new_reg, messages.NewRegistration) + if self.acme_version == 2: + url = self.directory.new_account + new_reg = messages.NewAccount() if new_reg is None else new_reg + else: + url = self.directory.new_reg + new_reg = messages.NewRegistration() if new_reg is None else new_reg - response = self.net.post(self.directory.new_reg, new_reg) + response = self.net.post(url, new_reg) # TODO: handle errors assert response.status_code == http_client.CREATED diff --git a/acme/acme/messages.py b/acme/acme/messages.py index 4b4fa5003..2c1a198eb 100644 --- a/acme/acme/messages.py +++ b/acme/acme/messages.py @@ -288,6 +288,13 @@ class NewRegistration(Registration): resource = fields.Resource(resource_type) +@Directory.register +class NewAccount(Registration): + """New account.""" + resource_type = 'new-account' # not used + resource = fields.Resource(resource_type) + + class UpdateRegistration(Registration): """Update registration.""" resource_type = 'reg'