azure-key-vault 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 14f95ef2cb7bf5a35564eaf2cdcabdfe2021ae82c70dd216d2b414aabcc08b00
4
+ data.tar.gz: ed2933a058f17415caacf02ccac98d5d63ee9dda71dbebd6fa577caf5fc44bb6
5
+ SHA512:
6
+ metadata.gz: 5823c8f29e088da5ceafe4907884af4fa7a018de9e0dceac1fcfe27d16b2e84787bdc34bfe4eff31ab1cf781e0558c9efa345d3b7430092ffb3d2f20f42f17ae
7
+ data.tar.gz: bc90aa686f941a5a78c86b55230966d33045e1d4622fd22d9280f9eb679d7f382a18adaff2fb97ff70935d146cb44f07fea510da73f82dd05d037ae9ce51fd51
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,119 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ azure-key-vault (0.0.15)
5
+ json_pure (~> 2.1)
6
+ rest-client (~> 2.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.3.0)
12
+ coderay (1.1.2)
13
+ diff-lcs (1.3)
14
+ domain_name (0.5.20170404)
15
+ unf (>= 0.0.5, < 1.0.0)
16
+ ffi (1.9.18)
17
+ formatador (0.2.5)
18
+ guard (2.14.2)
19
+ formatador (>= 0.2.4)
20
+ listen (>= 2.7, < 4.0)
21
+ lumberjack (>= 1.0.12, < 2.0)
22
+ nenv (~> 0.1)
23
+ notiffany (~> 0.0)
24
+ pry (>= 0.9.12)
25
+ shellany (~> 0.0)
26
+ thor (>= 0.18.1)
27
+ guard-bundler (2.1.0)
28
+ bundler (~> 1.0)
29
+ guard (~> 2.2)
30
+ guard-compat (~> 1.1)
31
+ guard-compat (1.2.1)
32
+ guard-rdoc (1.0.3)
33
+ guard
34
+ guard-rspec (4.7.3)
35
+ guard (~> 2.1)
36
+ guard-compat (~> 1.1)
37
+ rspec (>= 2.99.0, < 4.0)
38
+ http-cookie (1.0.3)
39
+ domain_name (~> 0.5)
40
+ json_pure (2.1.0)
41
+ listen (3.1.5)
42
+ rb-fsevent (~> 0.9, >= 0.9.4)
43
+ rb-inotify (~> 0.9, >= 0.9.7)
44
+ ruby_dep (~> 1.2)
45
+ lumberjack (1.0.12)
46
+ method_source (0.9.0)
47
+ mime-types (3.1)
48
+ mime-types-data (~> 3.2015)
49
+ mime-types-data (3.2016.0521)
50
+ nenv (0.3.0)
51
+ netrc (0.11.0)
52
+ notiffany (0.1.1)
53
+ nenv (~> 0.1)
54
+ shellany (~> 0.0)
55
+ parallel (1.12.1)
56
+ parser (2.4.0.2)
57
+ ast (~> 2.3)
58
+ powerpack (0.1.1)
59
+ pry (0.11.3)
60
+ coderay (~> 1.1.0)
61
+ method_source (~> 0.9.0)
62
+ rainbow (3.0.0)
63
+ rake (10.4.2)
64
+ rb-fsevent (0.10.2)
65
+ rb-inotify (0.9.10)
66
+ ffi (>= 0.5.0, < 2)
67
+ rb-readline (0.5.5)
68
+ rdoc (4.3.0)
69
+ rest-client (2.0.2)
70
+ http-cookie (>= 1.0.2, < 2.0)
71
+ mime-types (>= 1.16, < 4.0)
72
+ netrc (~> 0.8)
73
+ rspec (3.7.0)
74
+ rspec-core (~> 3.7.0)
75
+ rspec-expectations (~> 3.7.0)
76
+ rspec-mocks (~> 3.7.0)
77
+ rspec-core (3.7.0)
78
+ rspec-support (~> 3.7.0)
79
+ rspec-expectations (3.7.0)
80
+ diff-lcs (>= 1.2.0, < 2.0)
81
+ rspec-support (~> 3.7.0)
82
+ rspec-mocks (3.7.0)
83
+ diff-lcs (>= 1.2.0, < 2.0)
84
+ rspec-support (~> 3.7.0)
85
+ rspec-support (3.7.0)
86
+ rubocop (0.52.1)
87
+ parallel (~> 1.10)
88
+ parser (>= 2.4.0.2, < 3.0)
89
+ powerpack (~> 0.1)
90
+ rainbow (>= 2.2.2, < 4.0)
91
+ ruby-progressbar (~> 1.7)
92
+ unicode-display_width (~> 1.0, >= 1.0.1)
93
+ ruby-progressbar (1.9.0)
94
+ ruby_dep (1.5.0)
95
+ shellany (0.0.1)
96
+ thor (0.20.0)
97
+ unf (0.1.4)
98
+ unf_ext
99
+ unf_ext (0.0.7.4)
100
+ unicode-display_width (1.3.0)
101
+
102
+ PLATFORMS
103
+ ruby
104
+
105
+ DEPENDENCIES
106
+ azure-key-vault!
107
+ bundler (~> 1.12)
108
+ guard
109
+ guard-bundler
110
+ guard-rdoc
111
+ guard-rspec
112
+ rake (~> 10.0)
113
+ rb-readline
114
+ rdoc (~> 4.2)
115
+ rspec (~> 3.0)
116
+ rubocop
117
+
118
+ BUNDLED WITH
119
+ 1.12.5
data/Guardfile ADDED
@@ -0,0 +1,19 @@
1
+ ## Uncomment and set this to only include directories you want to watch
2
+ # directories %w(lib config test spec features) \
3
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
4
+ interactor :off
5
+
6
+ guard :rspec, cmd: 'bundle exec rspec' do
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
9
+ end
10
+
11
+ guard :rdoc, main: 'README.md' do
12
+ #watch('README.md')
13
+ watch(%r{^README.md|lib/.+\.rb$}) { |m | ['lib', 'README.md'] }
14
+ end
15
+
16
+ guard :bundler do
17
+ watch('Gemfile')
18
+ watch(%r{^(.+\.gemspec)$})
19
+ end
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # azure-key-vault
2
+ Ruby wrapper for Azure Key Vault REST API
3
+
4
+ ## Examples
5
+
6
+ ### Get an access token
7
+ `bearer_token = KeyVault::Auth.new(tenant_id, client_id, client_secret).bearer_token`
8
+
9
+ ### Get client for and existing Azure Key Vault
10
+ `vault = KeyVault::Client.new(vault_name, bearer_token)`
11
+
12
+ or
13
+
14
+ `vault = KeyVault::Client.new(vault_name, bearer_token, api_version: '<other _api_version>')`
15
+
16
+ ### Get the most recent version of a secret
17
+ `vault.get_secret(secret_name)`
18
+
19
+ ### Get a specific version of a secret
20
+ `vault.get_secret(secret_name, secret_version)`
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rdoc/task'
4
+
5
+ begin
6
+ require 'rspec/core/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+
10
+ task :default => :spec
11
+ rescue LoadError
12
+ # no rspec available
13
+ end
14
+
15
+ RDoc::Task.new do |rdoc|
16
+ rdoc.rdoc_dir = 'doc'
17
+ rdoc.main = 'README.md'
18
+ rdoc.rdoc_files.include('README.md', 'lib')
19
+ end
@@ -0,0 +1,32 @@
1
+ # -*- mode: ruby; -*-
2
+ $LOAD_PATH.unshift 'lib'
3
+ require 'key_vault/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'azure-key-vault'
7
+ s.version = KeyVault::VERSION.split(/[-+]/, 2).first
8
+ s.date = Time.now.strftime('%Y-%m-%d')
9
+ s.summary = 'Ruby Client for Azure Key Vault'
10
+ s.homepage = 'https://github.com/MikeAScott/azure-key-vault'
11
+ s.email = 'mike.scott2@hiscox.com'
12
+ s.authors = ['Mike Scott']
13
+ s.has_rdoc = false
14
+ s.license = 'MIT'
15
+
16
+ s.files = (%x[git ls-files]).split($RS) - %w[.gitignore]
17
+ s.require_paths = %w[lib]
18
+
19
+ s.add_runtime_dependency 'json_pure', '~>2.1'
20
+ s.add_runtime_dependency 'rest-client', '~>2.0'
21
+
22
+ s.add_development_dependency 'bundler', '~> 1.12'
23
+ s.add_development_dependency 'rake', '~> 10.0'
24
+ s.add_development_dependency 'rspec', '~> 3.0'
25
+ s.add_development_dependency 'rdoc', '~> 4.2'
26
+ s.add_development_dependency 'rubocop'
27
+ s.add_development_dependency 'rb-readline'
28
+ s.add_development_dependency 'guard'
29
+ s.add_development_dependency 'guard-rspec'
30
+ s.add_development_dependency 'guard-rdoc'
31
+ s.add_development_dependency 'guard-bundler'
32
+ end
data/lib/key_vault.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'key_vault/version'
2
+ require 'key_vault/client'
3
+ require 'key_vault/auth'
4
+
5
+ # Provides a simple Ruby interface for the Azure Key Vault REST API
6
+ module KeyVault
7
+ # The default Azure REST API version
8
+ DEFAULT_API_VERSION = '2016-10-01'.freeze
9
+ end
@@ -0,0 +1,53 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ module KeyVault
4
+ # Authenticater for Azure Key Vault
5
+ class Auth
6
+ # Create authenticator using Azure principal
7
+ # ==== Parameters:
8
+ # +tenant_id+:: Azure tenant id
9
+ # +client_id+:: Azure client id or (key)
10
+ # +client_secret+:: Azure client secret
11
+ def initialize(tenant_id, client_id, client_secret)
12
+ @tenant_id = tenant_id
13
+ @client_id = client_id
14
+ @client_secret = client_secret
15
+ end
16
+
17
+ # Authenticates with Azure using OAUTH 2.0
18
+ # ==== Returns:
19
+ # A string containing the bearer token for insertion into request headers
20
+ # ==== Raises:
21
+ # +ArgumentError+:: If the authentication request format is invalid
22
+ # +KeyVault::Unauthorized+:: If authentication fails authorization
23
+ def bearer_token
24
+ result = RestClient::Request.execute(method: :post,
25
+ url: url,
26
+ payload: body,
27
+ headers: headers)
28
+ token_resp = JSON.parse(result)
29
+ "Bearer #{token_resp['access_token']}"
30
+ rescue RestClient::BadRequest
31
+ raise ArgumentError, 'Could not authenticate to Azure (Bad Request)'
32
+ rescue RestClient::Unauthorized
33
+ raise KeyVault::Unauthorized
34
+ end
35
+
36
+ private
37
+
38
+ def headers
39
+ { 'Content-Type' => 'application/x-www-form-urlencoded' }
40
+ end
41
+
42
+ def url
43
+ "https://login.windows.net/#{@tenant_id}/oauth2/token"
44
+ end
45
+
46
+ def body
47
+ { 'grant_type' => 'client_credentials',
48
+ 'client_id' => @client_id,
49
+ 'client_secret' => @client_secret,
50
+ 'resource' => 'https://vault.azure.net' }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,69 @@
1
+ require 'key_vault/auth'
2
+ require 'key_vault/url'
3
+ require 'key_vault/exceptions'
4
+ require 'rest-client'
5
+ require 'json'
6
+
7
+ module KeyVault
8
+ # Client for Azure Key Vault
9
+ #
10
+ # Allows creation and retrieval of secrets from Azure Key Vault
11
+ #
12
+ # *N.B.* Secret names can contain only contain alphanumerics or hyphens.
13
+ # Any 'invalid' characters will be translated into hyphens.
14
+ class Client
15
+ # version of the Azure REST API being used
16
+ attr_reader :api_version
17
+
18
+ # Create client for a key vault
19
+ #
20
+ # ==== Parameters:
21
+ # +vault_name+:: The name of the key vault
22
+ # +bearer_token+:: The token obtained from #KeyVault::Auth
23
+ # +api_version+:: (*optional*) Version of the azure REST API to use.
24
+ # Defaults to +DEFAULT_API_VERSION+
25
+ def initialize(vault_name, bearer_token, api_version: DEFAULT_API_VERSION)
26
+ @vault_name = vault_name
27
+ @api_version = api_version || DEFAULT_API_VERSION
28
+ @bearer_token = bearer_token
29
+ @vault_url = Url.new(@vault_name)
30
+ end
31
+
32
+ # Retrieves secret from key vault as a string
33
+ #
34
+ # ==== Parameters:
35
+ # +secret_name+:: Name of the secret (alphanumeric with hyphens)
36
+ # +secret_version+:: (*optional*) Version of the secret to retrieve.
37
+ # Defaults to latest version
38
+ # ==== Returns:
39
+ # A string containing the secret value or nil if not found
40
+ def get_secret(secret_name, secret_version = nil)
41
+ url = @vault_url.get_url(clean(secret_name), secret_version, @api_version)
42
+ headers = { 'Authorization' => @bearer_token }
43
+ response = RestClient.get(url, headers)
44
+ JSON.parse(response)['value']
45
+ rescue RestClient::NotFound
46
+ return nil
47
+ end
48
+
49
+ # Adds a secret to key vault
50
+ #
51
+ # ==== Parameters:
52
+ # +secret_name+:: Name of the secret (alphanumeric with hyphens)
53
+ # +secret_value+:: Value of the secret as a string
54
+ def create_secret(secret_name, secret_value)
55
+ url = @vault_url.get_url(clean(secret_name), nil, @api_version)
56
+ body = @vault_url.get_body(secret_value)
57
+ headers = { 'Content-Type' => 'application/json',
58
+ 'Authorization' => @bearer_token }
59
+ RestClient.put(url, body, headers)
60
+ end
61
+
62
+ private
63
+
64
+ # Replaces non alphanumerics with hyphens
65
+ def clean(name)
66
+ name.gsub(/[^a-zA-Z0-9-]/, '-')
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,8 @@
1
+ module KeyVault
2
+ # Unauthorized Exception
3
+ class Unauthorized < StandardError
4
+ def initialize(msg = 'Not authorised for Azure with supplied credentials')
5
+ super
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,37 @@
1
+ module KeyVault
2
+ # Helper for Key Vault URL's and REST document bodies
3
+ # :category: Internal
4
+ class Url
5
+ # Creates URL for keyvault from +bearer_token+ and +vault_name+
6
+ def initialize(vault_name)
7
+ @vault_name = vault_name
8
+ end
9
+
10
+ # Gets URL for the secret
11
+ def get_url(secret_name, version, api_version)
12
+ base_url = format(base_secret_url,
13
+ vault_name: CGI.escape(@vault_name),
14
+ secret_name: CGI.escape(secret_name))
15
+ base_url << "/#{version}" if version
16
+ base_url << get_api_version_string(api_version)
17
+ base_url
18
+ end
19
+
20
+ # Returns +secret_value+ as a json doc
21
+ def get_body(secret_value)
22
+ { 'value' => secret_value }.to_json
23
+ end
24
+
25
+ private
26
+
27
+ # Returns url for the key vault
28
+ def base_secret_url
29
+ 'https://%<vault_name>s.vault.azure.net/secrets/%<secret_name>s'
30
+ end
31
+
32
+ # Returns api_version url parameter
33
+ def get_api_version_string(api_version)
34
+ "?api-version=#{api_version}"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ module KeyVault
2
+ # Version number of this gem
3
+ VERSION = '0.0.15'.freeze
4
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+ describe KeyVault::Auth do
3
+ let(:tenant_id) {'the-tenant-id'}
4
+ let(:client_id) {'the-client-id'}
5
+ let(:client_secret) {'the-client-secret'}
6
+
7
+ describe('#new') do
8
+ it 'requires tenant_id, client_id and client_secret' do
9
+ auth = KeyVault::Auth.new(tenant_id,client_id, client_secret)
10
+ expect(auth).not_to be_nil
11
+ end
12
+ end
13
+
14
+ describe '.bearer_token' do
15
+ subject(:auth) { KeyVault::Auth.new(tenant_id,client_id, client_secret) }
16
+ let(:auth_url) { "https://login.windows.net/#{tenant_id}/oauth2/token" }
17
+ let(:access_token) { 'theaccesstoken' }
18
+ let(:auth_response) { %Q[{
19
+ "token_type":"Bearer",
20
+ "some_other_params":"...",
21
+ "resource":"https://vault.azure.net",
22
+ "access_token":"#{access_token}"
23
+ }] }
24
+
25
+ let(:rest_request) do
26
+ class_double('RestClient::Request')
27
+ .as_stubbed_const(:transfer_nested_constants => true)
28
+ end
29
+
30
+ it 'authenticates with Microsoft OAUTH' do
31
+ expect(rest_request).to receive(:execute).and_return(auth_response)
32
+ auth.bearer_token
33
+ end
34
+
35
+ it 'raises argument error if bad request is returned' do
36
+ expect(rest_request).to receive(:execute).and_raise(RestClient::BadRequest)
37
+ expect{auth.bearer_token}.to raise_error(ArgumentError)
38
+ end
39
+
40
+ it 'raises custom Unauthorized exception if unauthorized' do
41
+ expect(rest_request).to receive(:execute).and_raise(RestClient::Unauthorized)
42
+ expect{auth.bearer_token}.to raise_error(KeyVault::Unauthorized)
43
+ end
44
+
45
+ it 'posts credentials in the request payload' do
46
+ auth_body_with_credentials = {
47
+ 'grant_type' => 'client_credentials',
48
+ 'client_id' => client_id,
49
+ 'client_secret' => client_secret,
50
+ 'resource' => 'https://vault.azure.net'
51
+ }
52
+ expect(rest_request).to receive(:execute)
53
+ .with(hash_including(method: :post, payload: auth_body_with_credentials))
54
+ .and_return(auth_response)
55
+ auth.bearer_token
56
+ end
57
+
58
+ it 'returns the access_token as bearer token' do
59
+ expect(rest_request).to receive(:execute).and_return(auth_response)
60
+ expect(auth.bearer_token).to eq("Bearer #{access_token}")
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+ describe KeyVault::Client do
3
+ subject(:client) { KeyVault::Client.new(vault_name, bearer_token) }
4
+ let(:vault_name) { 'the-vault' }
5
+ let(:bearer_token) { 'Bearer tokenvalue' }
6
+
7
+ describe '#new' do
8
+ it 'requires vault_name and bearer_token' do
9
+ client = KeyVault::Client.new(vault_name, bearer_token)
10
+ expect(client).not_to be_nil
11
+ end
12
+
13
+ it 'defaults api_version' do
14
+ client = KeyVault::Client.new(vault_name, bearer_token)
15
+ expect(client.api_version).to eq KeyVault::DEFAULT_API_VERSION
16
+ end
17
+
18
+ it 'allows setting of api_version' do
19
+ client = KeyVault::Client.new(vault_name, bearer_token,
20
+ api_version: '2015-06-01')
21
+ expect(client.api_version).to eq '2015-06-01'
22
+ end
23
+ end
24
+
25
+ describe '.get_secret' do
26
+ let(:secret_name) { 'the-secret' }
27
+ let(:secret_value) { 'top secret' }
28
+ let(:api_version) { KeyVault::DEFAULT_API_VERSION }
29
+ let(:secret_url) { "https://#{vault_name}.vault.azure.net/secrets/#{secret_name}?api-version=#{api_version}" }
30
+ let(:valid_response) do
31
+ <<-RESPONSE
32
+ {
33
+ "value": "#{secret_value}",
34
+ "contentType": "String",
35
+ "id": "https://#{vault_name}.vault.azure.net/secrets/#{secret_name}/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
36
+ "attributes": {
37
+ "enabled": true,
38
+ "created": 1512680041,
39
+ "updated": 1512680041,
40
+ "recoveryLevel": "Purgeable"
41
+ }
42
+ }
43
+ RESPONSE
44
+ end
45
+ let(:rest_request) do
46
+ class_double('RestClient')
47
+ .as_stubbed_const(transfer_nested_constants: true)
48
+ end
49
+
50
+ context 'when secret_version is not supplied' do
51
+ it 'requests GET from secret url' do
52
+ expect(rest_request).to receive(:get)
53
+ .with(secret_url, 'Authorization' => bearer_token )
54
+ .and_return(valid_response)
55
+ client.get_secret secret_name
56
+ end
57
+
58
+ it 'returns secret value from response' do
59
+ expect(rest_request).to receive(:get)
60
+ .and_return(valid_response)
61
+ returned_secret = client.get_secret secret_name
62
+ expect(returned_secret).to eq secret_value
63
+ end
64
+
65
+ it 'returns nil if secret not found' do
66
+ expect(rest_request).to receive(:get).and_raise(RestClient::NotFound)
67
+ returned_secret = client.get_secret 'not-a-secret'
68
+ expect(returned_secret).to be_nil
69
+ end
70
+
71
+ end
72
+
73
+ context 'when secret_version is supplied' do
74
+ let(:secret_version) { 'abcdef' }
75
+ let(:secret_url) { "https://#{vault_name}.vault.azure.net/secrets/#{secret_name}/#{secret_version}?api-version=#{api_version}" }
76
+ it 'requests that version of the secret' do
77
+ expect(rest_request).to receive(:get)
78
+ .with(secret_url, 'Authorization' => bearer_token)
79
+ .and_return(valid_response)
80
+ client.get_secret(secret_name, secret_version)
81
+ end
82
+ end
83
+
84
+ context 'when secret name has non alphanumerics' do
85
+ let(:secret_name_with_invalid_chars) { 'a secret::with!#&$chars-and-1234567890' }
86
+ let(:secret_name) { 'a-secret--with----chars-and-1234567890' }
87
+ it 'translates them to and spaces to hyphens' do
88
+ expect(rest_request).to receive(:get)
89
+ .with(secret_url, 'Authorization' => bearer_token)
90
+ .and_return(valid_response)
91
+ client.get_secret secret_name_with_invalid_chars
92
+ end
93
+ end
94
+
95
+
96
+ end
97
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe KeyVault::Url do
4
+ subject(:key_vault_url) { KeyVault::Url.new('the-vault-name') }
5
+
6
+ describe '#new' do
7
+ it 'requires a vault name' do
8
+ key_vault_url = KeyVault::Url.new('a-vault-name')
9
+ expect(key_vault_url).not_to be_nil
10
+ end
11
+ end
12
+
13
+ describe '.get_url' do
14
+ let(:secret_name) { 'the-secret-name' }
15
+ let(:secret_version) { '1234-1234-1234-1234' }
16
+ let(:api_version) { '2015-08-20' }
17
+ let(:correct_url) { "https://the-vault-name.vault.azure.net/secrets/#{secret_name}/#{secret_version}?api-version=#{api_version}" }
18
+
19
+ it 'gets url containing the vault and secret names' do
20
+ expect(key_vault_url.get_url(secret_name, secret_version, api_version))
21
+ .to eq correct_url
22
+ end
23
+
24
+ context 'when names in the URL need escaping' do
25
+ let(:url) { KeyVault::Url.new('the vault name') }
26
+ let(:encoded_url) { "https://the+vault+name.vault.azure.net/secrets/secret%3A%3Akey/#{secret_version}?api-version=#{api_version}" }
27
+ it 'URL encodes the URL' do
28
+ expect(url.get_url('secret::key', secret_version, api_version))
29
+ .to eq encoded_url
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.get_body' do
35
+ let(:correct_body) { { 'value' => 'the_secret_value' }.to_json }
36
+ it 'gets the secret value as json' do
37
+ expect(key_vault_url.get_body('the_secret_value')).to eq correct_body
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'KeyVault::VERSION' do
4
+ it 'gets the correct version' do
5
+ expect(KeyVault::VERSION).to eq '0.0.15'
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require 'key_vault'
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: azure-key-vault
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.15
5
+ platform: ruby
6
+ authors:
7
+ - Mike Scott
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json_pure
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rdoc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rb-readline
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard-rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-rdoc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: guard-bundler
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description:
182
+ email: mike.scott2@hiscox.com
183
+ executables: []
184
+ extensions: []
185
+ extra_rdoc_files: []
186
+ files:
187
+ - Gemfile
188
+ - Gemfile.lock
189
+ - Guardfile
190
+ - README.md
191
+ - Rakefile
192
+ - azurekeyvault.gemspec
193
+ - lib/key_vault.rb
194
+ - lib/key_vault/auth.rb
195
+ - lib/key_vault/client.rb
196
+ - lib/key_vault/exceptions.rb
197
+ - lib/key_vault/url.rb
198
+ - lib/key_vault/version.rb
199
+ - spec/key_vault/auth_spec.rb
200
+ - spec/key_vault/client_spec.rb
201
+ - spec/key_vault/url_spec.rb
202
+ - spec/key_vault/version_spec.rb
203
+ - spec/spec_helper.rb
204
+ homepage: https://github.com/MikeAScott/azure-key-vault
205
+ licenses:
206
+ - MIT
207
+ metadata: {}
208
+ post_install_message:
209
+ rdoc_options: []
210
+ require_paths:
211
+ - lib
212
+ required_ruby_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ requirements: []
223
+ rubyforge_project:
224
+ rubygems_version: 2.7.6
225
+ signing_key:
226
+ specification_version: 4
227
+ summary: Ruby Client for Azure Key Vault
228
+ test_files: []