duo_api 1.5.1 → 1.6.0

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/duo_api/api_client.rb +25 -10
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c2901cdf24a0a40675217841570d9483f01fc377c1942c97e6e7b10be65dc6e
4
- data.tar.gz: 9571e1c9261ad6d6d1cc818f283f61e9c8c18be78345323f59385d573b7820cd
3
+ metadata.gz: 3753b5e4577945ac32fcd29df3307e0452382f73399f75823d448d7272d26e60
4
+ data.tar.gz: 76612140f24f72a775157b6e905c971e1d1f203651ad01ee77a26c56fe396d8f
5
5
  SHA512:
6
- metadata.gz: 911450aebc22fb9a7a58b79c561c35f73ef8a5d3af69d201929a488505d56c05e539d06912062bff0d50afa31f7be1cb3790c44b4bcda80c867993a28acf734a
7
- data.tar.gz: 24007e11ad3f01e2de7d364f2dcf663f5d30764f7063cb2fcd85186f735dacffb1965df99b8cc684c145fdd9ccad00d4eea7d024e5a18dd8fe50ed900481228f
6
+ metadata.gz: e69f9e683ec473edafd2b2e835a351f9258aee5480e2414cce3d0f23a74c824e0f9076c795d2bcccbdd1dcfb44555da067308d17d3468d87e0bdf11b1c15e347
7
+ data.tar.gz: b2922d5baf7d43f8d349478bc11fd5c7d5619a915eec6cf45b2c301448fca527cb2de8f02d59d26e211b87f2d5aa13c0b6d3ab8582a1dfb1f92de4fbf8a376e9
@@ -13,16 +13,19 @@ require 'uri'
13
13
  #
14
14
  class DuoApi
15
15
  attr_accessor :ca_file
16
- attr_reader :default_params
16
+ attr_reader :default_params, :ca_pinning_disabled
17
17
 
18
18
  VERSION = Gem.loaded_specs['duo_api'] ? Gem.loaded_specs['duo_api'].version : '0.0.0'
19
19
 
20
+ # Version of the bundled CA certificate collection
21
+ CA_BUNDLE_VERSION = '1.0'
22
+
20
23
  # Constants for handling rate limit backoff
21
24
  MAX_BACKOFF_WAIT_SECS = 32
22
25
  INITIAL_BACKOFF_WAIT_SECS = 1
23
26
  BACKOFF_FACTOR = 2
24
27
 
25
- def initialize(ikey, skey, host, proxy = nil, ca_file: nil, default_params: {})
28
+ def initialize(ikey, skey, host, proxy = nil, ca_file: nil, disable_ca_pinning: false, default_params: {})
26
29
  @ikey = ikey
27
30
  @skey = skey
28
31
  @host = host
@@ -38,8 +41,15 @@ class DuoApi
38
41
  proxy_uri.password
39
42
  ]
40
43
  end
41
- @ca_file = ca_file ||
42
- File.join(File.dirname(__FILE__), '..', '..', 'ca_certs.pem')
44
+
45
+ raise ArgumentError, 'Cannot both disable CA pinning and provide a custom CA file' if disable_ca_pinning && ca_file
46
+
47
+ @ca_pinning_disabled = disable_ca_pinning
48
+ @ca_file = if disable_ca_pinning
49
+ nil
50
+ else
51
+ ca_file || File.join(File.dirname(__FILE__), '..', '..', 'ca_certs.pem')
52
+ end
43
53
  @default_params = default_params.transform_keys(&:to_sym)
44
54
  end
45
55
 
@@ -71,7 +81,7 @@ class DuoApi
71
81
  request = Net::HTTP.const_get(method.capitalize).new(uri.to_s)
72
82
  request.basic_auth(@ikey, signed)
73
83
  request['Date'] = current_date
74
- request['User-Agent'] = "duo_api_ruby/#{VERSION}"
84
+ request['User-Agent'] = user_agent
75
85
 
76
86
  # Set Content-Type and request body for JSON requests
77
87
  if params_go_in_body
@@ -80,11 +90,9 @@ class DuoApi
80
90
  end
81
91
 
82
92
  # Start the HTTP session
83
- Net::HTTP.start(
84
- uri.host, uri.port, *@proxy,
85
- use_ssl: true, ca_file: @ca_file,
86
- verify_mode: OpenSSL::SSL::VERIFY_PEER
87
- ) do |http|
93
+ http_opts = { use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_PEER }
94
+ http_opts[:ca_file] = @ca_file if @ca_file
95
+ Net::HTTP.start(uri.host, uri.port, *@proxy, **http_opts) do |http|
88
96
  wait_secs = INITIAL_BACKOFF_WAIT_SECS
89
97
  loop do
90
98
  resp = http.request(request)
@@ -101,6 +109,13 @@ class DuoApi
101
109
 
102
110
  private
103
111
 
112
+ # Build the User-Agent string, including the CA bundle version and the
113
+ # current CA pinning state.
114
+ def user_agent
115
+ ca_pinning_state = @ca_pinning_disabled ? 'disabled' : 'enabled'
116
+ "duo_api_ruby/#{VERSION} ca_bundle/#{CA_BUNDLE_VERSION} (ca_pinning=#{ca_pinning_state})"
117
+ end
118
+
104
119
  # Encode a key-value pair for a URL
105
120
  def encode_key_val(key, val)
106
121
  key = ERB::Util.url_encode(key.to_s)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duo_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duo Security
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-14 00:00:00.000000000 Z
11
+ date: 2026-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64