acme-client 2.0.22 → 2.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4c163dbc54a7e15b4e33aadbc892e9f9cca5fb4d2332873e9f0a4ca4b46d144
4
- data.tar.gz: 7fedb1bf7034c1a52a5f05169782e31b31749ecd6d8beb1a22da60ed44d49731
3
+ metadata.gz: 57864d566a88b4298a243bfaa6f34b5556a7aa1f36f41fd4e61636d0e7fae74e
4
+ data.tar.gz: c68a9476baa8fad93f9373e16d3dad6249edb2cc7f007d0d1bf4386cf0cf7f6e
5
5
  SHA512:
6
- metadata.gz: b1431a5b7890db3433aded0eaa9bccbdd14b60d9d95da840ee8d42e18c4f304e57b78431fa1313a77b06cb7e3e114dcba59471d48b8a1b3e099cc06eb4728df1
7
- data.tar.gz: c2e0b53200d61ae3d38ea75b656dc92de9751ad32a6a86a3346cd8ac843fccab097c70dd5e1d6870597510c33b6cdfde866de6e31f919d96fc23c91edc83384c
6
+ metadata.gz: c2cb942f81bfb49f952f955b9eea415b86718c8fe4fb3426cf7cdc1fcb8925b97dfe20e07300480fef894b6438ab5b2046d670564f8bc66a8a80bd5f14e2a282
7
+ data.tar.gz: f5343edaa0fb6543d2f37e6017732969e63e687c9db877ff8ba188444244e1a180b59cedfbbef12d021a702f65cb089fc08f0ec79ab2363b660343d9df421f5c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## `2.0.25`
2
+
3
+ * Add support for profiles extension
4
+
5
+ ## `2.0.24`
6
+
7
+ * Add support for account orders url attribute.
8
+
9
+ ## `2.0.23`
10
+
11
+ * Allow Order to be create without url. Location is not always required in the specification.
12
+
1
13
  ## `2.0.22`
2
14
 
3
15
  * Loosen base64 dependency constraint
data/README.md CHANGED
@@ -244,6 +244,22 @@ new_private_key = OpenSSL::PKey::RSA.new(4096)
244
244
  client.account_key_change(new_private_key: new_private_key)
245
245
  ```
246
246
 
247
+ ### Profile Extension
248
+
249
+ Provide a CA profile when creating a new order:
250
+
251
+ ```ruby
252
+ order = client.new_order(identifiers: ['example.com'], profile: 'shortlived')
253
+ ```
254
+
255
+ ACME servers may list supported profiles in the directory endpoint:
256
+
257
+ ```ruby
258
+ client.profiles => {"classic": "https://example.com/docs/classic", "shortlived": "https://example.com/docs/shortlived"}
259
+ ```
260
+
261
+ See the [RFC draft of certificate profiles](https://datatracker.ietf.org/doc/draft-aaron-acme-profiles/) for more info.
262
+
247
263
  ## Requirements
248
264
 
249
265
  Ruby >= 3.0
@@ -9,6 +9,7 @@ class Acme::Client::Error < StandardError
9
9
  class CertificateNotReady < ClientError; end
10
10
  class ForcedChainNotFound < ClientError; end
11
11
  class OrderNotReady < ClientError; end
12
+ class OrderNotReloadable < ClientError; end
12
13
 
13
14
  class ServerError < Acme::Client::Error; end
14
15
  class AlreadyRevoked < ServerError; end
@@ -34,16 +34,18 @@ class Acme::Client::Resources::Account
34
34
  url: url,
35
35
  term_of_service: term_of_service,
36
36
  status: status,
37
- contact: contact
37
+ contact: contact,
38
+ orders: orders_url
38
39
  }
39
40
  end
40
41
 
41
42
  private
42
43
 
43
- def assign_attributes(url:, term_of_service:, status:, contact:)
44
+ def assign_attributes(url:, term_of_service:, status:, contact:, orders: nil)
44
45
  @url = url
45
46
  @term_of_service = term_of_service
46
47
  @status = status
47
48
  @contact = Array(contact)
49
+ @orders_url = orders
48
50
  end
49
51
  end
@@ -14,7 +14,8 @@ class Acme::Client::Resources::Directory
14
14
  terms_of_service: 'termsOfService',
15
15
  website: 'website',
16
16
  caa_identities: 'caaIdentities',
17
- external_account_required: 'externalAccountRequired'
17
+ external_account_required: 'externalAccountRequired',
18
+ profiles: 'profiles'
18
19
  }
19
20
 
20
21
  def initialize(client, **arguments)
@@ -45,6 +46,10 @@ class Acme::Client::Resources::Directory
45
46
  meta[DIRECTORY_META[:external_account_required]]
46
47
  end
47
48
 
49
+ def profiles
50
+ meta[DIRECTORY_META[:profiles]]
51
+ end
52
+
48
53
  def meta
49
54
  @directory[:meta]
50
55
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Acme::Client::Resources::Order
4
- attr_reader :url, :status, :contact, :finalize_url, :identifiers, :authorization_urls, :expires, :certificate_url
4
+ attr_reader :url, :status, :contact, :finalize_url, :identifiers, :authorization_urls, :expires, :certificate_url, :profile
5
5
 
6
6
  def initialize(client, **arguments)
7
7
  @client = client
@@ -9,6 +9,10 @@ class Acme::Client::Resources::Order
9
9
  end
10
10
 
11
11
  def reload
12
+ if url.nil?
13
+ raise Acme::Client::Error::OrderNotReloadable, 'Finalized orders are not reloadable for this CA'
14
+ end
15
+
12
16
  assign_attributes(**@client.order(url: url).to_h)
13
17
  true
14
18
  end
@@ -40,13 +44,14 @@ class Acme::Client::Resources::Order
40
44
  finalize_url: finalize_url,
41
45
  authorization_urls: authorization_urls,
42
46
  identifiers: identifiers,
43
- certificate_url: certificate_url
47
+ certificate_url: certificate_url,
48
+ profile: profile
44
49
  }
45
50
  end
46
51
 
47
52
  private
48
53
 
49
- def assign_attributes(url:, status:, expires:, finalize_url:, authorization_urls:, identifiers:, certificate_url: nil)
54
+ def assign_attributes(url: nil, status:, expires:, finalize_url:, authorization_urls:, identifiers:, certificate_url: nil, profile: nil) # rubocop:disable Layout/LineLength,Metrics/ParameterLists
50
55
  @url = url
51
56
  @status = status
52
57
  @expires = expires
@@ -54,5 +59,6 @@ class Acme::Client::Resources::Order
54
59
  @authorization_urls = authorization_urls
55
60
  @identifiers = identifiers
56
61
  @certificate_url = certificate_url
62
+ @profile = profile
57
63
  end
58
64
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Acme
4
4
  class Client
5
- VERSION = '2.0.22'.freeze
5
+ VERSION = '2.0.25'.freeze
6
6
  end
7
7
  end
data/lib/acme/client.rb CHANGED
@@ -135,11 +135,12 @@ class Acme::Client
135
135
  @kid ||= account.kid
136
136
  end
137
137
 
138
- def new_order(identifiers:, not_before: nil, not_after: nil)
138
+ def new_order(identifiers:, not_before: nil, not_after: nil, profile: nil)
139
139
  payload = {}
140
140
  payload['identifiers'] = prepare_order_identifiers(identifiers)
141
141
  payload['notBefore'] = not_before if not_before
142
142
  payload['notAfter'] = not_after if not_after
143
+ payload['profile'] = profile if profile
143
144
 
144
145
  response = post(endpoint_for(:new_order), payload: payload)
145
146
  arguments = attributes_from_order_response(response)
@@ -253,6 +254,10 @@ class Acme::Client
253
254
  directory.external_account_required
254
255
  end
255
256
 
257
+ def profiles
258
+ directory.profiles
259
+ end
260
+
256
261
  private
257
262
 
258
263
  def load_directory
@@ -286,6 +291,7 @@ class Acme::Client
286
291
  response.body,
287
292
  :status,
288
293
  [:term_of_service, 'termsOfServiceAgreed'],
294
+ :orders,
289
295
  :contact
290
296
  )
291
297
  end
@@ -298,7 +304,8 @@ class Acme::Client
298
304
  [:finalize_url, 'finalize'],
299
305
  [:authorization_urls, 'authorizations'],
300
306
  [:certificate_url, 'certificate'],
301
- :identifiers
307
+ :identifiers,
308
+ :profile
302
309
  )
303
310
 
304
311
  attributes[:url] = response.headers[:location] if response.headers[:location]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acme-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.22
4
+ version: 2.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Barbier
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-07-01 00:00:00.000000000 Z
10
+ date: 2025-08-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rake