Module: LicenseKit

Defined in:
lib/licensekit/generated/clients.rb,
lib/licensekit/types.rb,
lib/licensekit/client.rb,
lib/licensekit/errors.rb,
lib/licensekit/scopes.rb,
lib/licensekit/version.rb,
lib/licensekit/verification.rb,
lib/licensekit/generated/metadata.rb,
lib/licensekit/generated/operation_scopes.rb

Overview

Generated by scripts/generate_from_openapi.rb. Do not edit manually.

Defined Under Namespace

Modules: Generated Classes: ApiError, BaseClient, DefaultTransport, ManagementClient, ManagementRawClient, PublicKeyStore, RawResponse, RequestOptions, RetryOptions, RuntimeClient, RuntimeRawClient, SystemClient, SystemRawClient, TransportError, TransportRequest, TransportResponse, VerificationResult

Constant Summary collapse

MANAGEMENT_SCOPES =
Generated::MANAGEMENT_SCOPES
OPERATION_SCOPES =
Generated::OPERATION_SCOPES
VERSION =
"1.0.0".freeze

Class Method Summary collapse

Class Method Details

.api_error?(value) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/licensekit/errors.rb', line 32

def self.api_error?(value)
  value.is_a?(ApiError)
end

.find_public_key(keys, kid) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/licensekit/verification.rb', line 51

def self.find_public_key(keys, kid)
  if keys.is_a?(PublicKeyStore)
    keys.get(kid)
  else
    Array(keys).find { |key| key["kid"] == kid }
  end
end

.get_required_scopes(operation_id) ⇒ Object



5
6
7
8
# File 'lib/licensekit/scopes.rb', line 5

def self.get_required_scopes(operation_id)
  entry = OPERATION_SCOPES.fetch(operation_id)
  entry[:scopes]
end

.has_required_scopes(operation_id, scopes) ⇒ Object



10
11
12
13
14
15
# File 'lib/licensekit/scopes.rb', line 10

def self.has_required_scopes(operation_id, scopes)
  granted = Array(scopes).map(&:to_s)
  return true if granted.include?("admin")

  get_required_scopes(operation_id).all? { |scope| granted.include?(scope) }
end

.normalize_base_url(base_url) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
15
16
# File 'lib/licensekit/client.rb', line 11

def self.normalize_base_url(base_url)
  trimmed = base_url.to_s.strip
  raise ArgumentError, "base_url is required" if trimmed.empty?

  trimmed.sub(%r{/+\z}, "")
end

.parse_error_envelope(body) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/licensekit/errors.rb', line 36

def self.parse_error_envelope(body)
  return nil unless body.is_a?(Hash)

  error = body["error"]
  return nil unless error.is_a?(Hash)
  return nil unless error["code"].is_a?(String) && error["message"].is_a?(String)

  result = {
    "error" => {
      "code" => error["code"],
      "message" => error["message"]
    }
  }

  result["error"]["detail"] = error["detail"] if error["detail"].is_a?(String)

  meta = body["meta"]
  if meta.is_a?(Hash) && meta["request_id"].is_a?(String) && meta["timestamp"].is_a?(String)
    result["meta"] = {
      "request_id" => meta["request_id"],
      "timestamp" => meta["timestamp"]
    }
  end

  result
end

.verify_runtime_payload(data, signature, keys) ⇒ Object

Raises:

  • (TypeError)


59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/licensekit/verification.rb', line 59

def self.verify_runtime_payload(data, signature, keys)
  public_key = find_public_key(keys, signature.fetch("kid"))
  raise TypeError, "Unknown public key kid: #{signature.fetch('kid')}" if public_key.nil?

  if public_key.fetch("algorithm") != "Ed25519" || signature.fetch("alg") != "Ed25519"
    raise TypeError, "Unsupported signature algorithm: expected Ed25519, received key=#{public_key.fetch('algorithm')}, signature=#{signature.fetch('alg')}"
  end

  verify_key = keys.is_a?(PublicKeyStore) ? keys.verify_key(public_key.fetch("kid")) : Ed25519::VerifyKey.new(LicenseKit.send(:decode_base64, public_key.fetch("public_key")))
  payload = stable_json_bytes(data)
  signature_bytes = LicenseKit.send(:decode_base64, signature.fetch("value"))

  begin
    verify_key.verify(signature_bytes, payload)
    VerificationResult.new(ok: true, key: public_key)
  rescue Ed25519::VerifyError
    VerificationResult.new(ok: false, key: public_key)
  end
end

.verify_runtime_result(result, keys) ⇒ Object



79
80
81
# File 'lib/licensekit/verification.rb', line 79

def self.verify_runtime_result(result, keys)
  verify_runtime_payload(result.fetch("data"), result.fetch("signature"), keys)
end