duo_api 1.0.1 → 1.1.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 (4) hide show
  1. checksums.yaml +5 -5
  2. data/ca_certs.pem +0 -33
  3. data/lib/duo_api.rb +31 -5
  4. metadata +19 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3dbe4e0d65e21b3cb74f30d8e4f4177c22a7d85b
4
- data.tar.gz: 388d4cea86812e72793887a4d1d98e889046bd43
2
+ SHA256:
3
+ metadata.gz: 0f2b8f7a8d60157304a3a8e84c3fece39dcd84cf42395cf6e4e960f95c948a2b
4
+ data.tar.gz: a8dff536f99c10f9af74e9c105ae6df3c703c05d977ab1036e3e3f3a9cbcbe1d
5
5
  SHA512:
6
- metadata.gz: 3dc753b45e67b55fe6f17957d25d2cb2580d2b10900f5a5f8350f372ce2e6cdce6c9ee71c51059ee809aceb3c39e6a98a89a602117b69d6e75fe5a4bc25fdd9c
7
- data.tar.gz: a72398d525f1875c35cfe0e083e07add5d7d5211f9532a4adcb4e42fa087afdae5910643c15f41d451c32af9311718d61a0d4a03618d958ba910460d08e33342
6
+ metadata.gz: 7218998f5487aeac26d0dae382309e7ae2b671ff74516c2e34fe68198b3a96be04db976a796a2f145721b6a42873e338626cfae815912e5f7c5339291825a701
7
+ data.tar.gz: ac33087ef7e635650708f73a52996f0a934fb42729a7455045336d5bccf5393690c93192d48df823b97139601d90ee39aae0837e36428cd07ea6621a693c5662
@@ -1,36 +1,3 @@
1
- subject= /C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority
2
-
3
- -----BEGIN CERTIFICATE-----
4
- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE
5
- BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50
6
- cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
7
- MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
8
- AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1
9
- dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw
10
- CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3
11
- dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
12
- Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow
13
- OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
14
- b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0
15
- VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN
16
- iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk
17
- mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT
18
- MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY
19
- pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
20
- BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs
21
- aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM
22
- aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
23
- cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo
24
- dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi
25
- gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC
26
- AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE
27
- FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9
28
- B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn
29
- CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx
30
- xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6
31
- rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
32
- -----END CERTIFICATE-----
33
-
34
1
  subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root CA
35
2
  -----BEGIN CERTIFICATE-----
36
3
  MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
@@ -10,6 +10,12 @@ class DuoApi
10
10
  @@encode_regex = Regexp.new('[^-_.~a-zA-Z\\d]')
11
11
  attr_accessor :ca_file
12
12
 
13
+ # Constants for handling rate limit backoff
14
+ MAX_BACKOFF_WAIT_SECS = 32
15
+ INITIAL_BACKOFF_WAIT_SECS = 1
16
+ BACKOFF_FACTOR = 2
17
+ RATE_LIMITED_RESP_CODE = '429'
18
+
13
19
  def initialize(ikey, skey, host, proxy = nil, ca_file: nil)
14
20
  @ikey = ikey
15
21
  @skey = skey
@@ -39,19 +45,39 @@ class DuoApi
39
45
 
40
46
  Net::HTTP.start(uri.host, uri.port, *@proxy,
41
47
  use_ssl: true, ca_file: @ca_file,
42
- verify_mode: OpenSSL::SSL::VERIFY_PEER) do |http|
43
- http.request(request)
48
+ verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
49
+ wait_secs = INITIAL_BACKOFF_WAIT_SECS
50
+ while true do
51
+ resp = http.request(request)
52
+ if resp.code != RATE_LIMITED_RESP_CODE or wait_secs > MAX_BACKOFF_WAIT_SECS
53
+ return resp
54
+ end
55
+ random_offset = rand()
56
+ sleep(wait_secs + random_offset)
57
+ wait_secs *= BACKOFF_FACTOR
58
+ end
44
59
  end
45
60
  end
46
61
 
47
62
  private
48
63
 
64
+ def encode_key_val(k, v)
65
+ # encode the key and the value for a url
66
+ key = URI.encode(k.to_s, @@encode_regex)
67
+ value = URI.encode(v.to_s, @@encode_regex)
68
+ key + '=' + value
69
+ end
70
+
49
71
  def encode_params(params_hash = nil)
50
72
  return '' if params_hash.nil?
51
73
  params_hash.sort.map do |k, v|
52
- key = URI.encode(k.to_s, @@encode_regex)
53
- value = URI.encode(v.to_s, @@encode_regex)
54
- key + '=' + value
74
+ # when it is an array, we want to add that as another param
75
+ # eg. next_offset = ['1547486297000', '5bea1c1e-612c-4f1d-b310-75fd31385b15']
76
+ if v.is_a?(Array)
77
+ encode_key_val(k, v[0]) + '&' + encode_key_val(k, v[1])
78
+ else
79
+ encode_key_val(k, v)
80
+ end
55
81
  end.join('&')
56
82
  end
57
83
 
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.0.1
4
+ version: 1.1.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: 2017-01-23 00:00:00.000000000 Z
11
+ date: 2019-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.46.0
33
+ version: 0.49.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.46.0
40
+ version: 0.49.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: test-unit
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.8.0
55
69
  description: A Ruby implementation of the Duo API.
56
70
  email: support@duo.com
57
71
  executables: []
@@ -80,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
94
  version: '0'
81
95
  requirements: []
82
96
  rubyforge_project:
83
- rubygems_version: 2.5.1
97
+ rubygems_version: 2.7.6
84
98
  signing_key:
85
99
  specification_version: 4
86
100
  summary: Duo API Ruby