vault 0.1.3 → 0.1.4

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
  SHA1:
3
- metadata.gz: 12a80ba875f11be9224f21addf0e95de643e5748
4
- data.tar.gz: f07616511bd7f411c2480be2974da8a0903a83cb
3
+ metadata.gz: 4e65904a28c46a6472dbbf09106bf0a195f9d291
4
+ data.tar.gz: 6ffa1d55b773e146db6292da052a8a05aa6e6ba4
5
5
  SHA512:
6
- metadata.gz: 8742288bd182858eadde1bbba7281cc26c5f34cad4fcbb9311d93624f928752ca64a3c76683ca02d0b7d22caaa60ea386e81cfad6fd93557a1a5840dd3fb2510
7
- data.tar.gz: 107c0be18482c2e8a399013dc3854418ab197e0da7c639edc1170f769ede69b050c40f6f046b77d334d6e3ba385869d49b8bd9351917ec092e8d7543ac816d4d
6
+ metadata.gz: ea8558f0ffc17e853c0042555add482dfbc4c43a8061df636dd8441602d5e2610ffe2c7c241074108eb6c8aae84ecd9e3175417fc636e5071a9f978771d292f4
7
+ data.tar.gz: d87e2b3784fc0c9ee8d701d8fbbebaa5ddd319ba907452bf4e44ecf0eb1137d32e48adaed433a93dff38fcbb427d2c7d43be4f958d220d679c4b8e128a670cef
@@ -3,7 +3,7 @@ cache: bundler
3
3
  sudo: false
4
4
 
5
5
  before_install: |-
6
- wget -O vault.zip -q https://dl.bintray.com/mitchellh/vault/vault_0.1.1_linux_amd64.zip
6
+ wget -O vault.zip -q https://dl.bintray.com/mitchellh/vault/vault_0.2.0_linux_amd64.zip
7
7
  unzip vault.zip
8
8
  mkdir ~/bin
9
9
  mv vault ~/bin
@@ -14,4 +14,7 @@ branches:
14
14
  - master
15
15
 
16
16
  rvm:
17
+ - 1.9.3
18
+ - 2.0
19
+ - 2.1
17
20
  - 2.2
@@ -1,5 +1,22 @@
1
1
  # Vault Ruby Changelog
2
2
 
3
+ ## v0.1.4 (August 15, 2015)
4
+
5
+ IMPROVEMENTS
6
+
7
+ - Add support for using a custom CA cert [GH-8]
8
+ - Allow clients to specify timeouts [GH-12, GH-14]
9
+ - Show which error caused the HTTPConnectionError [GH-30]
10
+ - Allow clients to specify which SSL cipher suites to use [GH-29]
11
+ - Allow clients to specify the SSL pem password [GH-22, GH-31]
12
+
13
+ BUG FIXES
14
+
15
+ - Read local token (`~/.vault-token`) for token if present [GH-13]
16
+ - Disable bad SSL cipher suites and force TLSv1.2 [GH-16]
17
+ - Update to test against Vault 0.2.0 [GH-20]
18
+ - Do not attempt a read on logical path write [GH-11, GH-32]
19
+
3
20
  ## v0.1.3 (May 14, 2015)
4
21
 
5
22
  BUG FIXES
@@ -1,12 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vault (0.1.3)
4
+ vault (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ coderay (1.1.0)
9
10
  diff-lcs (1.2.5)
11
+ method_source (0.8.2)
12
+ pry (0.10.1)
13
+ coderay (~> 1.1.0)
14
+ method_source (~> 0.8.1)
15
+ slop (~> 3.4)
10
16
  rake (10.4.2)
11
17
  rspec (3.2.0)
12
18
  rspec-core (~> 3.2.0)
@@ -21,12 +27,17 @@ GEM
21
27
  diff-lcs (>= 1.2.0, < 2.0)
22
28
  rspec-support (~> 3.2.0)
23
29
  rspec-support (3.2.2)
30
+ slop (3.6.0)
24
31
 
25
32
  PLATFORMS
26
33
  ruby
27
34
 
28
35
  DEPENDENCIES
29
36
  bundler (~> 1.9)
37
+ pry
30
38
  rake (~> 10.0)
31
39
  rspec (~> 3.2)
32
40
  vault!
41
+
42
+ BUNDLED WITH
43
+ 1.10.6
data/README.md CHANGED
@@ -5,6 +5,10 @@ Vault is the official Ruby client for interacting with [Vault](https://vaultproj
5
5
 
6
6
  Quick Start
7
7
  -----------
8
+ Install Ruby 2.0+: [Guide](https://www.ruby-lang.org/en/documentation/installation/).
9
+
10
+ > Please note that Vault Ruby may work on older Ruby installations like Ruby 1.9, but you **should not** use these versions of Ruby when communicating with a Vault server. Ruby 1.9 has [reached EOL](https://www.ruby-lang.org/en/news/2014/01/10/ruby-1-9-3-will-end-on-2015/) and will no longer receive important security patches or maintenance updates. There _are known security vulnerabilities_ specifically around SSL ciphers, which this library uses to communicate with a Vault server. While many distros still ship with Ruby 1.9 as the default, you are **highly discouraged** from using this library on any version of Ruby lower than Ruby 2.0.
11
+
8
12
  Install via Rubygems:
9
13
 
10
14
  $ gem install vault
@@ -49,6 +53,16 @@ Vault::Client.configure do |config|
49
53
 
50
54
  # Use SSL verification, also read as ENV["VAULT_SSL_VERIFY"]
51
55
  config.ssl_verify = false
56
+
57
+ # Timeout the connection after a certain amount of time (seconds), also read
58
+ # as ENV["VAULT_TIMEOUT"]
59
+ config.timeout = 30
60
+
61
+ # It is also possible to have finer-grained controls over the timeouts, these
62
+ # may also be read as environment variables
63
+ config.ssl_timeout = 5
64
+ config.open_timeout = 5
65
+ config.read_timeout = 30
52
66
  end
53
67
  ```
54
68
 
@@ -8,31 +8,38 @@ module Vault
8
8
 
9
9
  require_relative "vault/api"
10
10
 
11
- extend Vault::Configurable
12
-
13
- # API client object based off the configured options in {Configurable}.
14
- #
15
- # @return [Vault::Client]
16
- def self.client
17
- if !defined?(@client) || !@client.same_options?(options)
18
- @client = Vault::Client.new(options)
11
+ class << self
12
+ # API client object based off the configured options in {Configurable}.
13
+ #
14
+ # @return [Vault::Client]
15
+ attr_reader :client
16
+
17
+ def setup!
18
+ @client = Vault::Client.new
19
+
20
+ # Set secure SSL options
21
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS
22
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_NO_COMPRESSION
23
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_NO_SSLv2
24
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_NO_SSLv3
25
+
26
+ self
19
27
  end
20
- @client
21
- end
22
28
 
23
- # Delegate all methods to the client object, essentially making the module
24
- # object behave like a {Client}.
25
- def self.method_missing(m, *args, &block)
26
- if client.respond_to?(m)
27
- client.send(m, *args, &block)
28
- else
29
- super
29
+ # Delegate all methods to the client object, essentially making the module
30
+ # object behave like a {Client}.
31
+ def method_missing(m, *args, &block)
32
+ if client.respond_to?(m)
33
+ client.send(m, *args, &block)
34
+ else
35
+ super
36
+ end
30
37
  end
31
- end
32
38
 
33
- # Delegating +respond_to+ to the {Client}.
34
- def self.respond_to_missing?(m, include_private = false)
35
- client.respond_to?(m) || super
39
+ # Delegating +respond_to+ to the {Client}.
40
+ def respond_to_missing?(m, include_private = false)
41
+ client.respond_to?(m, include_private) || super
42
+ end
36
43
  end
37
44
  end
38
45
 
@@ -1,6 +1,7 @@
1
1
  module Vault
2
2
  module API
3
3
  require_relative "api/auth_token"
4
+ require_relative "api/auth"
4
5
  require_relative "api/help"
5
6
  require_relative "api/logical"
6
7
  require_relative "api/secret"
@@ -0,0 +1,102 @@
1
+ require "json"
2
+
3
+ require_relative "secret"
4
+ require_relative "../client"
5
+
6
+ module Vault
7
+ class Client
8
+ # A proxy to the {Auth} methods.
9
+ # @return [Auth]
10
+ def auth
11
+ @auth ||= Authenticate.new(self)
12
+ end
13
+ end
14
+
15
+ class Authenticate < Request
16
+ # Authenticate via the "token" authentication method. This authentication
17
+ # method is a bit bizarre because you already have a token, but hey,
18
+ # whatever floats your boat.
19
+ #
20
+ # This method hits the `/v1/auth/token/lookup-self` endpoint after setting
21
+ # the Vault client's token to the given token parameter. If the self lookup
22
+ # succeeds, the token is persisted onto the client for future requests. If
23
+ # the lookup fails, the old token (which could be unset) is restored on the
24
+ # client.
25
+ #
26
+ # @example
27
+ # Vault.auth.token("6440e1bd-ba22-716a-887d-e133944d22bd") #=> #<Vault::Secret lease_id="">
28
+ # Vault.token #=> "6440e1bd-ba22-716a-887d-e133944d22bd"
29
+ #
30
+ # @param [String] new_token
31
+ # the new token to try to authenticate and store on the client
32
+ #
33
+ # @return [Secret]
34
+ def token(new_token)
35
+ old_token = client.token
36
+ client.token = new_token
37
+ json = client.get("/v1/auth/token/lookup-self")
38
+ secret = Secret.decode(json)
39
+ return secret
40
+ rescue
41
+ client.token = old_token
42
+ raise
43
+ end
44
+
45
+ # Authenticate via the "app-id" authentication method. If authentication is
46
+ # successful, the resulting token will be stored on the client and used for
47
+ # future requests.
48
+ #
49
+ # @example
50
+ # Vault.auth.app_id(
51
+ # "aeece56e-3f9b-40c3-8f85-781d3e9a8f68",
52
+ # "3b87be76-95cf-493a-a61b-7d5fc70870ad",
53
+ # ) #=> #<Vault::Secret lease_id="">
54
+ #
55
+ # @example with a custom mount point
56
+ # Vault.auth.app_id(
57
+ # "aeece56e-3f9b-40c3-8f85-781d3e9a8f68",
58
+ # "3b87be76-95cf-493a-a61b-7d5fc70870ad",
59
+ # mount: "new-app-id",
60
+ # )
61
+ #
62
+ # @param [String] app_id
63
+ # @param [String] user_id
64
+ # @param [Hash] options
65
+ # additional options to pass to the authentication call, such as a custom
66
+ # mount point
67
+ #
68
+ # @return [Secret]
69
+ def app_id(app_id, user_id, options = {})
70
+ payload = { app_id: app_id, user_id: user_id }.merge(options)
71
+ json = client.post("/v1/auth/app-id/login", JSON.fast_generate(payload))
72
+ secret = Secret.decode(json)
73
+ client.token = secret.auth.client_token
74
+ return secret
75
+ end
76
+
77
+ # Authenticate via the "userpass" authentication method. If authentication
78
+ # is successful, the resulting token will be stored on the client and used
79
+ # for future requests.
80
+ #
81
+ # @example
82
+ # Vault.auth.userpass("sethvargo", "s3kr3t") #=> #<Vault::Secret lease_id="">
83
+ #
84
+ # @example with a custom mount point
85
+ # Vault.auth.userpass("sethvargo", "s3kr3t", mount: "admin-login") #=> #<Vault::Secret lease_id="">
86
+ #
87
+ # @param [String] username
88
+ # @param [String] password
89
+ # @param [Hash] options
90
+ # additional options to pass to the authentication call, such as a custom
91
+ # mount point
92
+ #
93
+ # @return [Secret]
94
+ def userpass(username, password, options = {})
95
+ payload = { password: password }.merge(options)
96
+ json = client.post("/v1/auth/userpass/login/#{username}", JSON.fast_generate(payload))
97
+ secret = Secret.decode(json)
98
+ client.token = secret.auth.client_token
99
+ return secret
100
+ end
101
+ end
102
+ end
@@ -45,7 +45,11 @@ module Vault
45
45
  # @return [Secret]
46
46
  def write(path, data = {})
47
47
  json = client.put("/v1/#{path}", JSON.fast_generate(data))
48
- return json.nil? ? read(path) : Secret.decode(json)
48
+ if json.nil?
49
+ return true
50
+ else
51
+ return Secret.decode(json)
52
+ end
49
53
  end
50
54
 
51
55
  # Delete the secret at the given path. If the secret does not exist, vault
@@ -28,6 +28,25 @@ module Vault
28
28
  symbolize_names: true,
29
29
  }.freeze
30
30
 
31
+ RESCUED_EXCEPTIONS = [].tap do |a|
32
+ # Failure to even open the socket (usually permissions)
33
+ a << SocketError
34
+
35
+ # Failed to reach the server (aka bad URL)
36
+ a << Errno::ECONNREFUSED
37
+
38
+ # Failed to read body or no response body given
39
+ a << EOFError
40
+
41
+ # Timeout (Ruby 1.9-)
42
+ a << Timeout::Error
43
+
44
+ # Timeout (Ruby 1.9+) - Ruby 1.9 does not define these constants so we
45
+ # only add them if they are defiend
46
+ a << Net::ReadTimeout if defined?(Net::ReadTimeout)
47
+ a << Net::OpenTimeout if defined?(Net::OpenTimeout)
48
+ end.freeze
49
+
31
50
  include Vault::Configurable
32
51
 
33
52
  # Create a new Client with the given options. Any options given take
@@ -37,12 +56,7 @@ module Vault
37
56
  def initialize(options = {})
38
57
  # Use any options given, but fall back to the defaults set on the module
39
58
  Vault::Configurable.keys.each do |key|
40
- value = if options[key].nil?
41
- Vault.instance_variable_get(:"@#{key}")
42
- else
43
- options[key]
44
- end
45
-
59
+ value = options.key?(key) ? options[key] : Defaults.public_send(key)
46
60
  instance_variable_set(:"@#{key}", value)
47
61
  end
48
62
  end
@@ -103,10 +117,6 @@ module Vault
103
117
  # @return [String, Hash]
104
118
  # the response body
105
119
  def request(verb, path, data = {}, headers = {})
106
- # All requests to vault require a token, so we should error without even
107
- # trying if there is no token set
108
- raise MissingTokenError if token.nil?
109
-
110
120
  # Build the URI and request object from the given information
111
121
  uri = build_uri(verb, path, data)
112
122
  request = class_for_request(verb).new(uri.request_uri)
@@ -135,18 +145,34 @@ module Vault
135
145
  connection = Net::HTTP.new(uri.host, uri.port,
136
146
  proxy_address, proxy_port, proxy_username, proxy_password)
137
147
 
148
+ # Use a custom open timeout
149
+ if open_timeout || timeout
150
+ connection.open_timeout = (open_timeout || timeout).to_i
151
+ end
152
+
153
+ # Use a custom read timeout
154
+ if read_timeout || timeout
155
+ connection.read_timeout = (read_timeout || timeout).to_i
156
+ end
157
+
138
158
  # Create the cookie for the request.
139
159
  cookie = CGI::Cookie.new
140
160
  cookie.name = "token"
141
161
  cookie.value = token
142
162
  cookie.path = "/"
143
- cookie.expires = Time.now + (60*60*24*376)
163
+ cookie.expires = Time.now + (60*60*24*365)
144
164
 
145
165
  # Apply SSL, if applicable
146
166
  if uri.scheme == "https"
147
167
  # Turn on SSL
148
168
  connection.use_ssl = true
149
169
 
170
+ # Vault requires TLS1.2
171
+ connection.ssl_version = "TLSv1_2"
172
+
173
+ # Only use secure ciphers
174
+ connection.ciphers = ssl_ciphers
175
+
150
176
  # Turn on secure cookies
151
177
  cookie.secure = true
152
178
 
@@ -154,37 +180,56 @@ module Vault
154
180
  if ssl_pem_file
155
181
  pem = File.read(ssl_pem_file)
156
182
  connection.cert = OpenSSL::X509::Certificate.new(pem)
157
- connection.key = OpenSSL::PKey::RSA.new(pem)
183
+ connection.key = OpenSSL::PKey::RSA.new(pem, ssl_pem_passphrase)
158
184
  connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
159
185
  end
160
186
 
161
- # Naughty, naughty, naughty! Don't blame when when someone hops in
187
+ # Use custom CA cert for verification
188
+ if ssl_ca_cert
189
+ connection.ca_file = ssl_ca_cert
190
+ end
191
+
192
+ # Use custom CA path that contains CA certs
193
+ if ssl_ca_path
194
+ connection.ca_path = ssl_ca_path
195
+ end
196
+
197
+ # Naughty, naughty, naughty! Don't blame me when someone hops in
162
198
  # and executes a MITM attack!
163
- unless ssl_verify
199
+ if !ssl_verify
164
200
  connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
165
201
  end
166
- end
167
202
 
168
- # Add the cookie to the request.
169
- request["Cookie"] = cookie.to_s
203
+ # Use custom timeout for connecting and verifying via SSL
204
+ if ssl_timeout || timeout
205
+ connection.ssl_timeout = (ssl_timeout || timeout).to_i
206
+ end
207
+ end
170
208
 
171
- # Create a connection using the block form, which will ensure the socket
172
- # is properly closed in the event of an error.
173
- connection.start do |http|
174
- response = http.request(request)
209
+ # Add the cookie to the request if a token was given.
210
+ if !token.nil?
211
+ request["Cookie"] = cookie.to_s
212
+ end
175
213
 
176
- case response
177
- when Net::HTTPRedirection
178
- redirect = URI.parse(response["location"])
179
- request(verb, redirect, data, headers)
180
- when Net::HTTPSuccess
181
- success(response)
182
- else
183
- error(response)
214
+ begin
215
+ # Create a connection using the block form, which will ensure the socket
216
+ # is properly closed in the event of an error.
217
+ connection.start do |http|
218
+ response = http.request(request)
219
+
220
+ case response
221
+ when Net::HTTPRedirection
222
+ redirect = URI.parse(response["location"])
223
+ request(verb, redirect, data, headers)
224
+ when Net::HTTPSuccess
225
+ success(response)
226
+ else
227
+ error(response)
228
+ end
184
229
  end
230
+ rescue *RESCUED_EXCEPTIONS => e
231
+ raise HTTPConnectionError.new(address, e)
185
232
  end
186
- rescue SocketError, Errno::ECONNREFUSED, EOFError
187
- raise HTTPConnectionError.new(address)
188
233
  end
189
234
 
190
235
  # Construct a URL from the given verb and path. If the request is a GET or
@@ -269,6 +314,10 @@ module Vault
269
314
  # @param [HTTP::Message] response
270
315
  # the response object from the request
271
316
  def error(response)
317
+ if response.body && response.body.match("missing client token")
318
+ raise MissingTokenError
319
+ end
320
+
272
321
  if (response.content_type || '').include?("json")
273
322
  # Attempt to parse the error as JSON
274
323
  begin
@@ -6,12 +6,19 @@ module Vault
6
6
  @keys ||= [
7
7
  :address,
8
8
  :token,
9
+ :open_timeout,
9
10
  :proxy_address,
10
11
  :proxy_password,
11
12
  :proxy_port,
12
13
  :proxy_username,
14
+ :read_timeout,
15
+ :ssl_ciphers,
13
16
  :ssl_pem_file,
17
+ :ssl_ca_cert,
18
+ :ssl_ca_path,
14
19
  :ssl_verify,
20
+ :ssl_timeout,
21
+ :timeout,
15
22
  ]
16
23
  end
17
24
 
@@ -24,18 +31,6 @@ module Vault
24
31
  yield self
25
32
  end
26
33
 
27
- # Reset all the values to their defaults.
28
- #
29
- # @return [self]
30
- def reset!
31
- defaults = Defaults.options
32
- Vault::Configurable.keys.each do |key|
33
- instance_variable_set(:"@#{key}", defaults[key])
34
- end
35
- self
36
- end
37
- alias_method :setup!, :reset!
38
-
39
34
  # The list of options for this configurable.
40
35
  #
41
36
  # @return [Hash<Symbol, Object>]
@@ -1,9 +1,20 @@
1
+ require "pathname"
2
+
1
3
  module Vault
2
4
  module Defaults
3
5
  # The default vault address.
4
6
  # @return [String]
5
7
  VAULT_ADDRESS = "https://127.0.0.1:8200".freeze
6
8
 
9
+ # The path to the vault token on disk.
10
+ # @return [String]
11
+ VAULT_DISK_TOKEN = Pathname.new("~/.vault-token").expand_path.freeze
12
+
13
+ # The list of SSL ciphers to allow. You should not change this value unless
14
+ # you absolutely know what you are doing!
15
+ # @return [String]
16
+ SSL_CIPHERS = "TLSv1.2:!aNULL:!eNULL".freeze
17
+
7
18
  class << self
8
19
  # The list of calculated options for this configurable.
9
20
  # @return [Hash]
@@ -20,7 +31,18 @@ module Vault
20
31
  # The vault token to use for authentiation.
21
32
  # @return [String, nil]
22
33
  def token
23
- ENV["VAULT_TOKEN"]
34
+ if VAULT_DISK_TOKEN.exist? && VAULT_DISK_TOKEN.readable?
35
+ VAULT_DISK_TOKEN.read
36
+ else
37
+ ENV["VAULT_TOKEN"]
38
+ end
39
+ end
40
+
41
+ # The number of seconds to wait when trying to open a connection before
42
+ # timing out
43
+ # @return [String, nil]
44
+ def open_timeout
45
+ ENV["VAULT_OPEN_TIMEOUT"]
24
46
  end
25
47
 
26
48
  # The HTTP Proxy server address as a string
@@ -47,14 +69,46 @@ module Vault
47
69
  ENV["VAULT_PROXY_PORT"]
48
70
  end
49
71
 
72
+ # The number of seconds to wait when reading a response before timing out
73
+ # @return [String, nil]
74
+ def read_timeout
75
+ ENV["VAULT_READ_TIMEOUT"]
76
+ end
77
+
78
+ # The ciphers that will be used when communicating with vault over ssl
79
+ # You should only change the defaults if the ciphers are not available on
80
+ # your platform and you know what you are doing
81
+ # @return [String]
82
+ def ssl_ciphers
83
+ ENV["VAULT_SSL_CIPHERS"] || SSL_CIPHERS
84
+ end
85
+
50
86
  # The path to a pem on disk to use with custom SSL verification
51
87
  # @return [String, nil]
52
88
  def ssl_pem_file
53
89
  ENV["VAULT_SSL_CERT"]
54
90
  end
55
91
 
56
- # Verify SSL requests (default: true)
92
+ # The path to a pem on disk to use with custom SSL verification
93
+ # @return [String, nil]
94
+ def ssl_pem_passphrase
95
+ ENV["VAULT_SSL_CERT_PASSPHRASE"]
96
+ end
97
+
98
+ # The path to the CA cert on disk to use for certificate verification
99
+ # @return [String, nil]
100
+ def ssl_ca_cert
101
+ ENV["VAULT_CACERT"]
102
+ end
57
103
  #
104
+ # The path to the directory on disk holding CA certs to use
105
+ # for certificate verification
106
+ # @return [String, nil]
107
+ def ssl_ca_path
108
+ ENV["VAULT_CAPATH"]
109
+ end
110
+
111
+ # Verify SSL requests (default: true)
58
112
  # @return [true, false]
59
113
  def ssl_verify
60
114
  if ENV["VAULT_SSL_VERIFY"].nil?
@@ -63,6 +117,19 @@ module Vault
63
117
  %w[t y].include?(ENV["VAULT_SSL_VERIFY"].downcase[0])
64
118
  end
65
119
  end
120
+
121
+ # The number of seconds to wait for connecting and verifying SSL
122
+ # @return [String, nil]
123
+ def ssl_timeout
124
+ ENV["VAULT_SSL_TIMEOUT"]
125
+ end
126
+
127
+ # A default meta-attribute to set all timeout values - individually set
128
+ # timeout values will take precedence
129
+ # @return [String, nil]
130
+ def timeout
131
+ ENV["VAULT_TIMEOUT"]
132
+ end
66
133
  end
67
134
  end
68
135
  end
@@ -5,10 +5,18 @@ module Vault
5
5
  def initialize
6
6
  super <<-EOH
7
7
  Missing Vault token! I cannot make requests to Vault without a token. Please
8
- set a Vault token:
8
+ set a Vault token in the client:
9
9
 
10
10
  Vault.token = "42d1dee5-eb6e-102c-8d23-cc3ba875da51"
11
11
 
12
+ or authenticate with Vault using the Vault CLI:
13
+
14
+ $ vault auth ...
15
+
16
+ or set the environment variable $VAULT_TOKEN to the token value:
17
+
18
+ $ export VAULT_TOKEN="..."
19
+
12
20
  Please refer to the documentation for more examples.
13
21
  EOH
14
22
  end
@@ -17,13 +25,21 @@ EOH
17
25
  class HTTPConnectionError < VaultError
18
26
  attr_reader :address
19
27
 
20
- def initialize(address)
28
+ def initialize(address, exception)
21
29
  @address = address
30
+ @exception = exception
22
31
 
23
32
  super <<-EOH
24
33
  The Vault server at `#{address}' is not currently
25
- accepting connections. Please ensure that the server is running an that your
34
+ accepting connections. Please ensure that the server is running and that your
26
35
  authentication information is correct.
36
+
37
+ The original error was `#{exception.class}'. Additional information (if any) is
38
+ shown below:
39
+
40
+ #{exception.message}
41
+
42
+ Please refer to the documentation for more help.
27
43
  EOH
28
44
  end
29
45
  end
@@ -1,3 +1,3 @@
1
1
  module Vault
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.9"
23
+ spec.add_development_dependency "pry"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
25
  spec.add_development_dependency "rspec", "~> 3.2"
25
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vault
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seth Vargo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-14 00:00:00.000000000 Z
11
+ date: 2015-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -70,6 +84,7 @@ files:
70
84
  - Rakefile
71
85
  - lib/vault.rb
72
86
  - lib/vault/api.rb
87
+ - lib/vault/api/auth.rb
73
88
  - lib/vault/api/auth_token.rb
74
89
  - lib/vault/api/help.rb
75
90
  - lib/vault/api/logical.rb