omnivault 0.1.2 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +17 -2
- data/README.md +25 -49
- data/Rakefile +6 -2
- data/bin/omnivault +10 -0
- data/ext/mkrf_conf.rb +17 -0
- data/lib/omnivault.rb +3 -2
- data/lib/omnivault/abstract_vault.rb +49 -9
- data/lib/omnivault/apple_keychain.rb +11 -14
- data/lib/omnivault/cli.rb +83 -0
- data/lib/omnivault/pws.rb +11 -14
- data/lib/omnivault/v1_credential_provider.rb +22 -0
- data/lib/omnivault/v2_credential_provider.rb +18 -0
- data/lib/omnivault/version.rb +1 -1
- data/omnivault.gemspec +7 -4
- data/spec/omnivault/abstract_vault_spec.rb +36 -0
- data/test/install-bats.sh +8 -0
- data/test/linux.bats +26 -0
- data/test/osx.bats +26 -0
- metadata +89 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 361c058018a7a70bd62b0e7ceb01774feb0d9875
|
4
|
+
data.tar.gz: 1d94ffb860e487476c11c82a0975bbd8f3e89408
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e296df72737a57880f7924bf1317f6e20777c43551ea1c010a0be5a1849a43d9f016ca2589d2d6f20651e47c17408c91ec1bf2792ca588d6eb15afb8497bf3b3
|
7
|
+
data.tar.gz: 89ec90a7965a6a7d724c4f9259bda44278dd3a53c4e2fb054eece69f755570464b8d37df6ec1dea4a4db7be560de758c2ee5d8a9761d237eb2a532488b71cf9f
|
data/.travis.yml
CHANGED
@@ -1,2 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
sudo: true
|
2
|
+
language: ruby
|
3
|
+
cache: bundler
|
4
|
+
matrix:
|
5
|
+
include:
|
6
|
+
- os: osx
|
7
|
+
env:
|
8
|
+
- BATS_TEST=test/osx.bats
|
9
|
+
- os: linux
|
10
|
+
env:
|
11
|
+
- BATS_TEST=test/linux.bats
|
12
|
+
before_install:
|
13
|
+
- sudo test/install-bats.sh
|
14
|
+
script:
|
15
|
+
- bundle exec rake
|
16
|
+
- rake build && gem install pkg/omnivault-*.gem
|
17
|
+
- BUNDLE_GEMFILE= bats $BATS_TEST
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://travis-ci.org/aptible/omnivault)
|
5
5
|
[](https://gemnasium.com/aptible/omnivault)
|
6
6
|
|
7
|
-
A Ruby library to abstract keychain functionality for storing and retrieiving arbitrary secrets from a variety of password vaults.
|
7
|
+
A Ruby library and CLI tool to abstract keychain functionality for storing and retrieiving arbitrary secrets from a variety of password vaults.
|
8
8
|
|
9
9
|
Omnivault supports simple key-value secret retrieval with the following password vaults:
|
10
10
|
|
@@ -15,15 +15,29 @@ Additionally, it supports automatic credential setup for the following libraries
|
|
15
15
|
|
16
16
|
* AWS Ruby SDK (`aws-sdk-v1`, `aws-sdk`)
|
17
17
|
|
18
|
-
## Installation
|
18
|
+
## Installation and Usage (CLI Tool)
|
19
19
|
|
20
|
-
|
20
|
+
To install for CLI usage, simply run `gem install omnivault` and then refer to `omnivault help` for usage:
|
21
|
+
|
22
|
+
```
|
23
|
+
Commands:
|
24
|
+
omnivault env [-v VAULT] # Print secret values from vault as source-able ENV variables
|
25
|
+
omnivault exec [-v VAULT] COMMAND # Execute command with secret values as ENV variables
|
26
|
+
omnivault help [COMMAND] # Describe available commands or one specific command
|
27
|
+
omnivault ls [-v VAULT] # List all secret keys from vault
|
28
|
+
omnivault set [-v VAULT] KEY1=value1 [KEY2=value2 ...] # Set one or more secret values in vault
|
29
|
+
omnivault unset [-v VAULT] KEY1 [KEY2 ...] # Unset one or more secret values in vault
|
30
|
+
```
|
31
|
+
|
32
|
+
## Installation (Library)
|
33
|
+
|
34
|
+
Add the following line(s) to your application's Gemfile.
|
21
35
|
|
22
36
|
gem 'omnivault'
|
23
37
|
|
24
38
|
And then run `bundle install`.
|
25
39
|
|
26
|
-
## Usage
|
40
|
+
## Usage (Library)
|
27
41
|
|
28
42
|
To initialize the the Omnivault, run:
|
29
43
|
|
@@ -36,7 +50,8 @@ This will determine an appropriate provider using the following logic:
|
|
36
50
|
* If the ENV variable `VAULT` is set, it will use that provider, i.e.,
|
37
51
|
- Apple Keychain for `VAULT=apple`
|
38
52
|
- PWS for `VAULT=pws`
|
39
|
-
* If no ENV variable is set, it will try to use Apple Keychain first
|
53
|
+
* If no ENV variable is set, it will try to use Apple Keychain first on OS X, then PWS. If not on OS X only PWS will be
|
54
|
+
used.
|
40
55
|
|
41
56
|
Then, to use Omnivault, you can:
|
42
57
|
|
@@ -56,51 +71,12 @@ Omnivault provides a `configure_aws!` method, which can be used to automatically
|
|
56
71
|
omnivault.configure_aws!
|
57
72
|
```
|
58
73
|
|
59
|
-
To use this feature, you'll need to set
|
60
|
-
|
61
|
-
### Apple Keychain
|
62
|
-
|
63
|
-
To set up AWS credentials using `aws-keychain-util`:
|
64
|
-
|
65
|
-
1. `gem install -N aws-keychain-util`
|
66
|
-
2. `aws-creds init`
|
67
|
-
3. `aws-creds add`
|
68
|
-
|
69
|
-
- Use 'default' for the account name
|
70
|
-
- Leave the MFA ARN blank
|
71
|
-
|
72
|
-
4. (Optional) Add the following file as `aws` somewhere on your `PATH` with higher precedence than `/usr/local/bin`. (`$HOME/.bin` is a good choice.) Make it executable by running `chmod +x aws-safe`.
|
73
|
-
|
74
|
-
#!/bin/bash
|
75
|
-
# $HOME/.bin/aws
|
74
|
+
To use this feature, you'll need to set the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` secrets in Omnivault:
|
76
75
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
/usr/local/bin/aws $@
|
81
|
-
|
82
|
-
|
83
|
-
### PWS
|
84
|
-
|
85
|
-
On Linux, you can use PWS instead:
|
86
|
-
|
87
|
-
1. `gem install -N aws-pws`
|
88
|
-
2. `aws-pws init`
|
89
|
-
3. (Optional) Add the following file as `aws` somewhere on your `PATH` with higher precedence than `/usr/local/bin`.
|
90
|
-
|
91
|
-
#!/bin/bash
|
92
|
-
# $HOME/.bin/aws
|
93
|
-
|
94
|
-
set -e
|
95
|
-
|
96
|
-
export $(aws-pws cat)
|
97
|
-
/usr/local/bin/aws $@
|
98
|
-
|
99
|
-
## TODO
|
76
|
+
```
|
77
|
+
omnivault set AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
|
78
|
+
```
|
100
79
|
|
101
|
-
* Add support for 1Password keychains.
|
102
|
-
* Write RSpec unit tests.
|
103
|
-
* Remove dependence on AWS-specific gems directly
|
104
80
|
|
105
81
|
## Contributing
|
106
82
|
|
@@ -113,6 +89,6 @@ On Linux, you can use PWS instead:
|
|
113
89
|
|
114
90
|
MIT License, see [LICENSE](LICENSE.md) for details.
|
115
91
|
|
116
|
-
Copyright (c)
|
92
|
+
Copyright (c) 2017 [Aptible](https://www.aptible.com), Frank Macreery, and contributors.
|
117
93
|
|
118
94
|
[<img src="https://s.gravatar.com/avatar/f7790b867ae619ae0496460aa28c5861?s=60" style="border-radius: 50%;" alt="@fancyremarker" />](https://github.com/fancyremarker)
|
data/Rakefile
CHANGED
data/bin/omnivault
ADDED
data/ext/mkrf_conf.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/command'
|
3
|
+
require 'rubygems/dependency_installer'
|
4
|
+
|
5
|
+
begin
|
6
|
+
Gem::Command.build_args = ARGV
|
7
|
+
rescue NoMethodError
|
8
|
+
end
|
9
|
+
|
10
|
+
inst = Gem::DependencyInstaller.new
|
11
|
+
begin
|
12
|
+
inst.install 'ruby-keychain' if RbConfig::CONFIG['host_os'] =~ /darwin/
|
13
|
+
rescue => e
|
14
|
+
puts e.message
|
15
|
+
puts e.backtrace
|
16
|
+
exit 1
|
17
|
+
end
|
data/lib/omnivault.rb
CHANGED
@@ -5,7 +5,8 @@ require_relative 'omnivault/apple_keychain'
|
|
5
5
|
require_relative 'omnivault/pws'
|
6
6
|
|
7
7
|
module Omnivault
|
8
|
-
def self.autodetect
|
9
|
-
Omnivault::AbstractVault.from_env ||
|
8
|
+
def self.autodetect(name = 'default')
|
9
|
+
Omnivault::AbstractVault.from_env(name) ||
|
10
|
+
Omnivault::AbstractVault.for_platform(name)
|
10
11
|
end
|
11
12
|
end
|
@@ -1,22 +1,62 @@
|
|
1
1
|
module Omnivault
|
2
2
|
class AbstractVault
|
3
|
-
def self.from_env
|
3
|
+
def self.from_env(name = 'default')
|
4
4
|
case ENV['VAULT']
|
5
|
-
when 'apple', 'AppleKeychain'
|
6
|
-
AppleKeychain.new
|
5
|
+
when 'apple', 'keychain', 'AppleKeychain'
|
6
|
+
AppleKeychain.new(name)
|
7
7
|
when 'pws', 'PWS'
|
8
|
-
PWS.new
|
8
|
+
PWS.new(name)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
def self.for_platform
|
12
|
+
def self.for_platform(name = 'default')
|
13
13
|
if (/darwin/ =~ RUBY_PLATFORM).nil?
|
14
|
-
PWS.new
|
14
|
+
PWS.new(name)
|
15
15
|
else
|
16
|
-
AppleKeychain.new
|
16
|
+
AppleKeychain.new(name)
|
17
17
|
end
|
18
|
-
rescue LoadError
|
19
|
-
|
18
|
+
rescue LoadError => e
|
19
|
+
puts e.message
|
20
|
+
puts e.backtrace
|
21
|
+
PWS.new(name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Either aws-sdk and/or aws-sdk-v1 must be required BEFORE calling
|
25
|
+
# Omnivault::AbstractVault#configure_aws!
|
26
|
+
def configure_aws!
|
27
|
+
if defined?(Aws)
|
28
|
+
require_relative 'v2_credential_provider'
|
29
|
+
|
30
|
+
provider = V2CredentialProvider.new(self)
|
31
|
+
Aws.config[:credentials] = provider
|
32
|
+
end
|
33
|
+
|
34
|
+
if defined?(AWS)
|
35
|
+
require_relative 'v1_credential_provider'
|
36
|
+
|
37
|
+
provider = V1CredentialProvider.new(self)
|
38
|
+
AWS.config(credential_provider: provider)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize(_name = 'default')
|
43
|
+
raise NotImplementedError, 'Must invoke from subclass'
|
44
|
+
end
|
45
|
+
|
46
|
+
def entries
|
47
|
+
raise NotImplementedError, 'Must invoke from subclass'
|
48
|
+
end
|
49
|
+
|
50
|
+
def fetch(key)
|
51
|
+
entries[key]
|
52
|
+
end
|
53
|
+
|
54
|
+
def store(_key, _value)
|
55
|
+
raise NotImplementedError, 'Must invoke from subclass'
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove(_key)
|
59
|
+
raise NotImplementedError, 'Must invoke from subclass'
|
20
60
|
end
|
21
61
|
end
|
22
62
|
end
|
@@ -1,25 +1,22 @@
|
|
1
1
|
module Omnivault
|
2
2
|
class AppleKeychain < AbstractVault
|
3
|
-
|
3
|
+
attr_accessor :keychain
|
4
|
+
|
5
|
+
def initialize(name = 'default')
|
4
6
|
# Need to require within initializer, to avoid LoadError on
|
5
7
|
# non-Apple platforms
|
6
8
|
require 'keychain'
|
7
|
-
|
9
|
+
|
10
|
+
@keychain = open_or_create_keychain(name)
|
8
11
|
end
|
9
12
|
|
10
13
|
def entries
|
11
|
-
keychain = open_or_create_keychain
|
12
14
|
Hash[keychain.generic_passwords.all.map do |item|
|
13
15
|
[item.label, item.password]
|
14
16
|
end]
|
15
17
|
end
|
16
18
|
|
17
|
-
def fetch(key)
|
18
|
-
entries[key]
|
19
|
-
end
|
20
|
-
|
21
19
|
def store(key, value)
|
22
|
-
keychain = open_or_create_keychain
|
23
20
|
if (entry = keychain.generic_passwords.where(label: key).all.first)
|
24
21
|
entry.password = value
|
25
22
|
entry.save!
|
@@ -32,18 +29,18 @@ module Omnivault
|
|
32
29
|
end
|
33
30
|
end
|
34
31
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
32
|
+
def remove(key)
|
33
|
+
entry = keychain.generic_passwords.where(label: key).all.first
|
34
|
+
entry.delete
|
38
35
|
end
|
39
36
|
|
40
37
|
private
|
41
38
|
|
42
|
-
def open_or_create_keychain(name
|
43
|
-
keychain = Keychain.open("
|
39
|
+
def open_or_create_keychain(name)
|
40
|
+
keychain = Keychain.open("omnivault-#{name}.keychain")
|
44
41
|
return keychain if keychain.exists?
|
45
42
|
|
46
|
-
Keychain.create("
|
43
|
+
Keychain.create("omnivault-#{name}.keychain")
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'omnivault'
|
3
|
+
require 'shellwords'
|
4
|
+
|
5
|
+
module Omnivault
|
6
|
+
class CLI < Thor
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
# Forward return codes on failures.
|
10
|
+
def self.exit_on_failure?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.default_options
|
15
|
+
option :vault, aliases: '-v', default: 'default'
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.default_option_desc
|
19
|
+
'[-v VAULT]'
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "set #{default_option_desc} KEY1=value1 [KEY2=value2 ...]",
|
23
|
+
'Set one or more secret values in vault'
|
24
|
+
default_options
|
25
|
+
def set(*args)
|
26
|
+
raise ArgumentError, 'Wrong number of arguments' if args.empty?
|
27
|
+
|
28
|
+
hash = Hash[args.map { |arg| arg.split('=', 2) }]
|
29
|
+
hash.each do |key, value|
|
30
|
+
vault_by_name(options[:vault]).store(key, value)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "unset #{default_option_desc} KEY1 [KEY2 ...]",
|
35
|
+
'Unset one or more secret values in vault'
|
36
|
+
default_options
|
37
|
+
def unset(*args)
|
38
|
+
raise ArgumentError, 'Wrong number of arguments' if args.empty?
|
39
|
+
|
40
|
+
vault = vault_by_name(options[:vault])
|
41
|
+
missing = args - vault.entries.keys
|
42
|
+
raise Thor::Error, "Keys not found: #{missing.join(', ')}" if missing.any?
|
43
|
+
args.each do |key|
|
44
|
+
vault.remove(key)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "env #{default_option_desc}",
|
49
|
+
'Print secret values from vault as source-able ENV variables'
|
50
|
+
default_options
|
51
|
+
def env
|
52
|
+
vault_by_name(options[:vault]).entries.each do |key, value|
|
53
|
+
say "#{key}=#{Shellwords.escape(value)}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "exec #{default_option_desc} COMMAND",
|
58
|
+
'Execute command with secret values as ENV variables'
|
59
|
+
default_options
|
60
|
+
def exec(*args)
|
61
|
+
vault_by_name(options[:vault]).entries.each do |key, value|
|
62
|
+
ENV[key] = value
|
63
|
+
end
|
64
|
+
system(*args)
|
65
|
+
end
|
66
|
+
|
67
|
+
desc "ls #{default_option_desc}",
|
68
|
+
'List all secret keys from vault'
|
69
|
+
default_options
|
70
|
+
def ls
|
71
|
+
vault_by_name(options[:vault]).entries.keys.each do |key|
|
72
|
+
say key
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def vault_by_name(name)
|
79
|
+
@vaults ||= {}
|
80
|
+
@vaults[name] ||= Omnivault.autodetect(name)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/omnivault/pws.rb
CHANGED
@@ -1,27 +1,24 @@
|
|
1
|
-
require 'aws/pws'
|
2
|
-
require 'aws/pws/credential_provider'
|
3
|
-
|
4
1
|
module Omnivault
|
5
2
|
class PWS < AbstractVault
|
6
|
-
attr_accessor :
|
3
|
+
attr_accessor :cli, :raw_data
|
7
4
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
5
|
+
def initialize(name = 'default')
|
6
|
+
require 'pws'
|
7
|
+
|
8
|
+
@cli ||= ::PWS.new(namespace: name)
|
9
|
+
@raw_data = @cli.instance_variable_get(:@data)
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
|
12
|
+
def entries
|
13
|
+
Hash[raw_data.map { |k, v| [k, v[:password]] }]
|
15
14
|
end
|
16
15
|
|
17
16
|
def store(key, value)
|
18
|
-
|
19
|
-
@client.cli.add(key, value)
|
17
|
+
cli.add(key, value)
|
20
18
|
end
|
21
19
|
|
22
|
-
def
|
23
|
-
|
24
|
-
AWS.config(credential_provider: provider)
|
20
|
+
def remove(key)
|
21
|
+
cli.remove(key)
|
25
22
|
end
|
26
23
|
end
|
27
24
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'aws-sdk-v1'
|
2
|
+
|
3
|
+
module Omnivault
|
4
|
+
class V1CredentialProvider
|
5
|
+
include AWS::Core::CredentialProviders::Provider
|
6
|
+
|
7
|
+
attr_accessor :vault
|
8
|
+
|
9
|
+
def initialize(vault)
|
10
|
+
@vault = vault
|
11
|
+
end
|
12
|
+
|
13
|
+
# rubocop:disable AccessorMethodName
|
14
|
+
def get_credentials
|
15
|
+
{
|
16
|
+
access_key_id: vault.fetch('AWS_ACCESS_KEY_ID'),
|
17
|
+
secret_access_key: vault.fetch('AWS_SECRET_ACCESS_KEY')
|
18
|
+
}
|
19
|
+
end
|
20
|
+
# rubocop:enable AccessorMethodName
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Omnivault
|
4
|
+
class V2CredentialProvider
|
5
|
+
include Aws::CredentialProvider
|
6
|
+
|
7
|
+
attr_accessor :vault
|
8
|
+
|
9
|
+
def initialize(vault)
|
10
|
+
@vault = vault
|
11
|
+
end
|
12
|
+
|
13
|
+
def credentials
|
14
|
+
Aws::Credentials.new(vault.fetch('AWS_ACCESS_KEY_ID'),
|
15
|
+
vault.fetch('AWS_SECRET_ACCESS_KEY'))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/omnivault/version.rb
CHANGED
data/omnivault.gemspec
CHANGED
@@ -16,16 +16,19 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
18
18
|
spec.files = `git ls-files`.split($RS)
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
20
|
spec.test_files = spec.files.grep(%r{^spec/})
|
20
21
|
spec.require_paths = ['lib']
|
22
|
+
spec.extensions = 'ext/mkrf_conf.rb'
|
21
23
|
|
22
|
-
spec.add_dependency '
|
23
|
-
|
24
|
-
# aws-keychain-util is an optional dependency if using Mac OS X.
|
25
|
-
# spec.add_dependency 'aws-keychain-util'
|
24
|
+
spec.add_dependency 'thor'
|
25
|
+
spec.add_dependency 'pws'
|
26
26
|
|
27
27
|
spec.add_development_dependency 'bundler'
|
28
28
|
spec.add_development_dependency 'aptible-tasks'
|
29
29
|
spec.add_development_dependency 'rake'
|
30
30
|
spec.add_development_dependency 'rspec', '~> 2.0'
|
31
|
+
spec.add_development_dependency 'aws-sdk', '~> 2'
|
32
|
+
spec.add_development_dependency 'aws-sdk-v1'
|
33
|
+
spec.add_development_dependency 'pry'
|
31
34
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Omnivault::AbstractVault do
|
4
|
+
before do
|
5
|
+
# Override parent class initialization exception in tests
|
6
|
+
described_class.send(:define_method, :initialize) {}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#configure_aws!' do
|
10
|
+
before do
|
11
|
+
allow(subject).to receive(:entries) do
|
12
|
+
{
|
13
|
+
'AWS_ACCESS_KEY_ID' => 'id',
|
14
|
+
'AWS_SECRET_ACCESS_KEY' => 'secret'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'configures credentials for aws-sdk-v1' do
|
20
|
+
require 'aws-sdk-v1'
|
21
|
+
subject.configure_aws!
|
22
|
+
v1_credentials = AWS.config.credential_provider.credentials
|
23
|
+
expect(v1_credentials[:access_key_id]).to eq 'id'
|
24
|
+
expect(v1_credentials[:secret_access_key]).to eq 'secret'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'configures credentials for aws-sdk-v2' do
|
28
|
+
require 'aws-sdk'
|
29
|
+
subject.configure_aws!
|
30
|
+
|
31
|
+
v2_credentials = Aws.config[:credentials].credentials
|
32
|
+
expect(v2_credentials.access_key_id).to eq 'id'
|
33
|
+
expect(v2_credentials.secret_access_key).to eq 'secret'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/test/linux.bats
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env bats
|
2
|
+
|
3
|
+
setup() {
|
4
|
+
echo 'foobar
|
5
|
+
foobar' | pws -bats add FOO bar
|
6
|
+
}
|
7
|
+
|
8
|
+
teardown() {
|
9
|
+
rm -f $HOME/.pws-bats
|
10
|
+
}
|
11
|
+
|
12
|
+
@test "It should install the ruby-keychain gem" {
|
13
|
+
run gem list ruby-keychain
|
14
|
+
[[ ! "$output" =~ "ruby-keychain" ]]
|
15
|
+
}
|
16
|
+
|
17
|
+
@test "It should print secrets via omnivault env" {
|
18
|
+
run bash -c "echo foobar | omnivault env -v bats"
|
19
|
+
echo $output > $HOME/bats.out
|
20
|
+
[[ "$output" =~ "FOO=bar" ]]
|
21
|
+
}
|
22
|
+
|
23
|
+
@test "It should run a shell with secrets in ENV via omnivault exec" {
|
24
|
+
run bash -c "echo foobar | omnivault exec -v bats env"
|
25
|
+
[[ "$output" =~ "FOO=bar" ]]
|
26
|
+
}
|
data/test/osx.bats
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env bats
|
2
|
+
|
3
|
+
setup() {
|
4
|
+
security create-keychain -p foobar omnivault-bats.keychain
|
5
|
+
security add-generic-password -A -a FOO -s FOO -w bar omnivault-bats.keychain
|
6
|
+
security unlock-keychain -p foobar omnivault-bats.keychain
|
7
|
+
}
|
8
|
+
|
9
|
+
teardown() {
|
10
|
+
rm -f $HOME/Library/Keychains/omnivault-bats.keychain
|
11
|
+
}
|
12
|
+
|
13
|
+
@test "It should install the ruby-keychain gem" {
|
14
|
+
run gem list ruby-keychain
|
15
|
+
[[ "$output" =~ "ruby-keychain" ]]
|
16
|
+
}
|
17
|
+
|
18
|
+
@test "It should print secrets via omnivault env" {
|
19
|
+
run omnivault env -v bats
|
20
|
+
[[ "$output" =~ "FOO=bar" ]]
|
21
|
+
}
|
22
|
+
|
23
|
+
@test "It should run a shell with secrets in ENV via omnivault exec" {
|
24
|
+
run omnivault exec -v bats env
|
25
|
+
[[ "$output" =~ "FOO=bar" ]]
|
26
|
+
}
|
metadata
CHANGED
@@ -1,106 +1,173 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omnivault
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank Macreery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: thor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pws
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: aptible-tasks
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - ~>
|
87
|
+
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '2.0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - ~>
|
94
|
+
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '2.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: aws-sdk
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: aws-sdk-v1
|
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: pry
|
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'
|
83
139
|
description: Abstract password vault for multiple providers
|
84
140
|
email:
|
85
141
|
- frank@macreery.com
|
86
|
-
executables:
|
87
|
-
|
142
|
+
executables:
|
143
|
+
- omnivault
|
144
|
+
extensions:
|
145
|
+
- ext/mkrf_conf.rb
|
88
146
|
extra_rdoc_files: []
|
89
147
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .rspec
|
92
|
-
- .travis.yml
|
148
|
+
- ".gitignore"
|
149
|
+
- ".rspec"
|
150
|
+
- ".travis.yml"
|
93
151
|
- Gemfile
|
94
152
|
- LICENSE.md
|
95
153
|
- README.md
|
96
154
|
- Rakefile
|
155
|
+
- bin/omnivault
|
156
|
+
- ext/mkrf_conf.rb
|
97
157
|
- lib/omnivault.rb
|
98
158
|
- lib/omnivault/abstract_vault.rb
|
99
159
|
- lib/omnivault/apple_keychain.rb
|
160
|
+
- lib/omnivault/cli.rb
|
100
161
|
- lib/omnivault/pws.rb
|
162
|
+
- lib/omnivault/v1_credential_provider.rb
|
163
|
+
- lib/omnivault/v2_credential_provider.rb
|
101
164
|
- lib/omnivault/version.rb
|
102
165
|
- omnivault.gemspec
|
166
|
+
- spec/omnivault/abstract_vault_spec.rb
|
103
167
|
- spec/spec_helper.rb
|
168
|
+
- test/install-bats.sh
|
169
|
+
- test/linux.bats
|
170
|
+
- test/osx.bats
|
104
171
|
homepage: https://github.com/aptible/omnivault
|
105
172
|
licenses:
|
106
173
|
- MIT
|
@@ -111,19 +178,20 @@ require_paths:
|
|
111
178
|
- lib
|
112
179
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
180
|
requirements:
|
114
|
-
- -
|
181
|
+
- - ">="
|
115
182
|
- !ruby/object:Gem::Version
|
116
183
|
version: '0'
|
117
184
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
185
|
requirements:
|
119
|
-
- -
|
186
|
+
- - ">="
|
120
187
|
- !ruby/object:Gem::Version
|
121
188
|
version: '0'
|
122
189
|
requirements: []
|
123
190
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.4
|
191
|
+
rubygems_version: 2.6.4
|
125
192
|
signing_key:
|
126
193
|
specification_version: 4
|
127
194
|
summary: Abstract password vault for multiple providers
|
128
195
|
test_files:
|
196
|
+
- spec/omnivault/abstract_vault_spec.rb
|
129
197
|
- spec/spec_helper.rb
|