Sha256: 98459a4a8b75eb9c26ad2fbfd0e578194c5cc206c55e7501030dd864a5fee3f9

Contents?: true

Size: 1.77 KB

Versions: 7

Compression:

Stored size: 1.77 KB

Contents

# frozen_string_literal: true

class Acme::Client::Resources::Directory
  DIRECTORY_RESOURCES = {
    new_nonce: 'newNonce',
    new_account: 'newAccount',
    new_order: 'newOrder',
    new_authz: 'newAuthz',
    revoke_certificate: 'revokeCert',
    key_change: 'keyChange'
  }

  DIRECTORY_META = {
    terms_of_service: 'termsOfService',
    website: 'website',
    caa_identities: 'caaIdentities',
    external_account_required: 'externalAccountRequired'
  }

  def initialize(url, connection_options)
    @url, @connection_options = url, connection_options
  end

  def endpoint_for(key)
    directory.fetch(key) do |missing_key|
      raise Acme::Client::Error::UnsupportedOperation,
        "Directory at #{@url} does not include `#{missing_key}`"
    end
  end

  def terms_of_service
    meta[DIRECTORY_META[:terms_of_service]]
  end

  def website
    meta[DIRECTORY_META[:website]]
  end

  def caa_identities
    meta[DIRECTORY_META[:caa_identities]]
  end

  def external_account_required
    meta[DIRECTORY_META[:external_account_required]]
  end

  def meta
    directory[:meta]
  end

  private

  def directory
    @directory ||= load_directory
  end

  def load_directory
    body = fetch_directory
    result = {}
    result[:meta] = body.delete('meta')
    DIRECTORY_RESOURCES.each do |key, entry|
      result[key] = URI(body[entry]) if body[entry]
    end
    result
  rescue JSON::ParserError => exception
    raise Acme::Client::Error::InvalidDirectory,
      "Invalid directory url\n#{@directory} did not return a valid directory\n#{exception.inspect}"
  end

  def fetch_directory
    connection = Faraday.new(url: @directory, **@connection_options)
    connection.headers[:user_agent] = Acme::Client::USER_AGENT
    response = connection.get(@url)
    JSON.parse(response.body)
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
acme-client-2.0.8 lib/acme/client/resources/directory.rb
acme-client-2.0.7 lib/acme/client/resources/directory.rb
acme-client-2.0.6 lib/acme/client/resources/directory.rb
acme-client-2.0.5 lib/acme/client/resources/directory.rb
acme-client-2.0.4 lib/acme/client/resources/directory.rb
acme-client-2.0.3 lib/acme/client/resources/directory.rb
acme-client-2.0.2 lib/acme/client/resources/directory.rb