biscuit 0.0.4 → 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
- SHA1:
3
- metadata.gz: 253f89fecd633548a513fd8a14c3a14855064345
4
- data.tar.gz: af77d6cb79d80de2799057967a417286b496cc75
2
+ SHA256:
3
+ metadata.gz: c9d55cb873d9a420bce70989d2463e389a14ae834e168bf8f105b1a5bf182f42
4
+ data.tar.gz: 61188e6d68cc7c24d50a20a567e4266408ec3cd097c07e3cd450e49e0503f756
5
5
  SHA512:
6
- metadata.gz: 37c8c96c880392b7e87d5e267f5a69a3d9fc5019c938f44009f2640b4f2f817b3b3d3f5b1c675b9a770bf8d20dd9c8fd8fecc9ce89f8329a8206e7f3a0cb6a3c
7
- data.tar.gz: 9c7a0cce8635141c4ae1fb0593b35c27cf7f3f76d1ae5ee34aab096f645aea191cfa3ebb5af631cc94ccc906a9d3764cb7e0bc056bc2e93e1192c8b4970ae8ad
6
+ metadata.gz: 44c2897ae14a681bf090b21ada81c70ba77acb436e586eca6456da4d9400fa21afdf4a844d27dee2b30f018071904f542fe57eb799727cd06c402d1332e93cec
7
+ data.tar.gz: 603f4e54503779d12433ddcb2edd1af17a94a1d9aa17f0b24e63538b3f0668448dbf82fa93bdd760edecd5566c13fd4ab1902a3d34c6882a3aa6cb1ad5d1a930
@@ -0,0 +1,21 @@
1
+ name: Publish Gem
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "master"
7
+ - "github-workflow-publish-gem"
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v1
15
+
16
+ - name: Release Gem
17
+ uses: cadwallion/publish-rubygems-action@master
18
+ env:
19
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
20
+ RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
21
+ RELEASE_COMMAND: rake release
data/.gitignore CHANGED
@@ -3,7 +3,9 @@
3
3
  /Gemfile.lock
4
4
  /_yardoc/
5
5
  /coverage/
6
- /doc/
7
6
  /pkg/
8
7
  /spec/reports/
9
8
  /tmp/
9
+
10
+ # This is downloaded when the gem is installed:
11
+ bin/_biscuit
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3
4
+ - 2.4
5
+ - 2.5
6
+ - 2.6
7
+
8
+ before_script:
9
+ # Installs the _biscuit executable:
10
+ - rake
11
+
12
+ script:
13
+ - bundle exec rspec spec/ --format=doc
@@ -0,0 +1,16 @@
1
+ # 0.1.4
2
+ - [FIX] `open()` is deprecated for URIs. Uses `URI.open()`
3
+ - Bumps bundler version
4
+ - Bumps rake gem version
5
+
6
+ # 0.1.3
7
+ - No changes - apparently there was already a yanked 0.1.2 out there somewhere
8
+
9
+ # 0.1.2
10
+
11
+ - [FIX] Revert to using `YAML.load` to load the secrets
12
+ - [FIX] Don't split values containing `:` into broken pieces
13
+ - Relax `rake` dependency
14
+ - [DOC] Fill out README
15
+ - Set up CI
16
+ - Gitignore the actual `biscuit` binary
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in biscuit.gemspec
4
4
  gemspec
5
+
6
+ gem "rspec"
7
+ gem "coveralls", require: false
data/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2019 User Testing, Inc.
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
5
+ and associated documentation files (the "Software"), to deal in the Software without restriction,
6
+ including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all copies or substantial
11
+ portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
14
+ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
15
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
16
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
17
+ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,28 +1,108 @@
1
1
  # Biscuit
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/biscuit`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Travis](https://img.shields.io/travis/usertesting/biscuit?style=for-the-badge)](https://travis-ci.org/usertesting/biscuit) [![Coveralls github](https://img.shields.io/coveralls/github/usertesting/biscuit?style=for-the-badge)](https://coveralls.io/github/usertesting/biscuit) [![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/usertesting/biscuit?style=for-the-badge)](https://codeclimate.com/github/usertesting/biscuit)
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+
6
+ This gem is a Ruby wrapper around `@dcoker`'s [biscuit library](https://github.com/dcoker/biscuit), a multi-region HA key-value store for your AWS infrastructure secrets.
7
+
8
+ By using this Ruby library, it is easy to integrate into a Ruby/Rails stack.
6
9
 
7
10
  ## Installation
8
11
 
9
- Add this line to your application's Gemfile:
12
+ - Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'biscuit'
16
+ ```
17
+
18
+ - And then run `bundle`.
19
+
20
+ - `touch` a yaml file (or multiple for different environments).
21
+
22
+ ## Usage
23
+
24
+ ### Loading K/V pairs into a hash
25
+
26
+ ```ruby
27
+ secrets_file = "some_yaml_file.yaml"
28
+ SECRETS = Biscuit::SecretsDecrypter.new(secrets_file).load
29
+
30
+ puts SECRETS["some_password"]
31
+ # => "decrypted password"
32
+ ```
33
+
34
+ ### Loading into ENV Vars
35
+
36
+ If you store config in ENV vars as suggested by the [12 Factor App](https://12factor.net/config), you can load your AWS encrypted secrets into ENV vars like this:
10
37
 
11
38
  ```ruby
12
- gem 'biscuit'
39
+ secrets_file = "some_yaml_file.yaml"
40
+ Biscuit::SecretsDecrypter.new(secrets_file).load do |key, value|
41
+ ENV[key] = value
42
+ end
13
43
  ```
14
44
 
15
- And then execute:
45
+ This approach pairs with [dotenv](https://github.com/bkeepers/dotenv) really well - dotenv for test/development, and biscuit for staging/production environments.
46
+
47
+ #### With Rails
16
48
 
17
- $ bundle
49
+ Load your secrets in `application.rb`, between loading Rails/bundler, before the Application config starts:
18
50
 
19
- Or install it yourself as:
51
+ ```ruby
52
+ require "rails/all"
20
53
 
21
- $ gem install biscuit
54
+ ...
22
55
 
23
- ## Usage
56
+ Bundler.require(*Rails.groups)
57
+
58
+ ...
59
+
60
+ # Add in your biscuit loading here:
61
+ secrets_file = "#{__dir__}/secrets/#{Rails.env}.yml"
62
+ if File.exist?(secrets_file) # You can also check things like if Rails.env.production?
63
+ Biscuit::SecretsDecrypter.new(secrets_file).load do |key, value|
64
+ ENV[key] = value
65
+ end
66
+ end
67
+
68
+ ...
24
69
 
25
- TODO: Write usage instructions here
70
+ module MyApp
71
+ class Application < Rails::Application
72
+ ....
73
+ ```
74
+
75
+ #### Adding a new key
76
+
77
+ From the application root, run `biscuit put -f`, followed by the path to the yaml you want to encrypt in, followed by the key, followed by the example.
78
+
79
+ ```bash
80
+ $ biscuit put -f config/secrets/production.yml SECRET_KEY "sensitive value"
81
+ ```
82
+
83
+ #### Getting a key (CLI)
84
+
85
+ ```bash
86
+ $ biscuit export -f config/secrets/production.yml | grep "SECRET_KEY"
87
+ ```
88
+
89
+ #### A note on parsed values and quoting
90
+
91
+ Given this unencrypted YAML:
92
+
93
+ ```yaml
94
+ foo: 1,2,3,4,5
95
+ ```
96
+
97
+ You might think that `foo`'s value after being loaded would be `"1,2,3,4,5"`.
98
+ You'd be wrong... Ruby's YAML parser [strips out the commas](https://github.com/ruby/psych/issues/273), sees `12345`, and thinks "ah we have a number!"
99
+ Then the value is `12345`.
100
+
101
+ If you desire to keep the commas, you'll have to encode it quoted:
102
+
103
+ ```yaml
104
+ foo: "1,2,3,4,5"
105
+ ```
26
106
 
27
107
  ## Development
28
108
 
@@ -30,9 +110,17 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
30
110
 
31
111
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
112
 
113
+ ## License
114
+
115
+ [MIT](LICENSE).
116
+
117
+ Library created by [UserTesting](https://usertesting.com)
118
+
119
+ ![UserTesting](doc/UserTesting.png)
120
+
33
121
  ## Contributing
34
122
 
35
- 1. Fork it ( https://github.com/[my-github-username]/biscuit/fork )
123
+ 1. Fork it ( https://github.com/usertesting/biscuit/fork )
36
124
  2. Create your feature branch (`git checkout -b my-new-feature`)
37
125
  3. Commit your changes (`git commit -am 'Add some feature'`)
38
126
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1,8 +1,6 @@
1
- require 'bundler'
2
- require 'bundler/gem_tasks'
3
1
  require 'open-uri'
4
2
 
5
- UPSTREAM_VERSION = '0.1.2'
3
+ UPSTREAM_VERSION = '0.1.3'
6
4
 
7
5
  def fetch(release_url)
8
6
  tgz_path = download_file(release_url)
@@ -14,7 +12,7 @@ end
14
12
  def download_file(url)
15
13
  filename = URI(url).path.split('/').last
16
14
 
17
- IO.copy_stream(open(url), "/tmp/#{filename}")
15
+ IO.copy_stream(URI.open(url), "/tmp/#{filename}")
18
16
 
19
17
  "/tmp/#{filename}"
20
18
  end
data/bin/biscuit CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  this_gems_root = Gem::Specification.find_by_name("biscuit").gem_dir
4
+
5
+ # We aren't using Biscuit.run! here because we want output to be streamed as it arrives for interactive use,
6
+ # and we don't care about capturing the result
4
7
  system("#{this_gems_root}/bin/_biscuit", *ARGV)
8
+
5
9
  exit $?.exitstatus
data/biscuit.gemspec CHANGED
@@ -6,27 +6,22 @@ require 'biscuit/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "biscuit"
8
8
  spec.version = Biscuit::VERSION
9
- spec.authors = ["Suan-Aik Yeo"]
10
- spec.email = ["yeosuanaik@gmail.com"]
9
+ spec.authors = ["Suan-Aik Yeo", "Justin Aiken"]
10
+ spec.email = ["yeosuanaik@gmail.com", "60tonangel@gmail.com"]
11
11
 
12
12
  spec.summary = %q{Ruby wrapper for biscuit (https://github.com/dcoker/biscuit).}
13
13
  spec.description = %q{Ruby wrapper for biscuit (https://github.com/dcoker/biscuit).}
14
14
  spec.homepage = "https://github.com/usertesting/biscuit"
15
+ spec.license = "MIT"
15
16
 
16
- # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
- # delete this section to allow pushing this gem to any host.
18
- if spec.respond_to?(:metadata)
19
- spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
20
- else
21
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
- end
23
-
24
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|doc)/}) }
25
18
  spec.bindir = "bin"
26
19
  spec.executables = 'biscuit'
27
20
  spec.require_paths = ["lib"]
28
21
  spec.extensions = ["Rakefile"]
29
22
 
30
- spec.add_development_dependency "bundler", "~> 1.9"
31
- spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "bundler", "~> 2.1"
24
+ spec.add_development_dependency "rake", "~> 13.0"
25
+
26
+ spec.add_runtime_dependency "rake"
32
27
  end
data/lib/biscuit.rb CHANGED
@@ -1,5 +1,14 @@
1
1
  require "biscuit/version"
2
+ require "biscuit/secrets_decrypter"
3
+ require "biscuit/execution_error"
4
+
5
+ require "open3"
6
+ require "yaml"
2
7
 
3
8
  module Biscuit
4
- # Your code goes here...
9
+ def self.run!(command)
10
+ stdout, stderr, status = Open3.capture3("#{__dir__}/../bin/_biscuit #{command}")
11
+ raise Biscuit::ExecutionError.new(stderr, stdout) unless status == 0
12
+ stdout
13
+ end
5
14
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Biscuit
4
+ class ExecutionError < StandardError
5
+ def initialize(stderr, stdout=nil)
6
+ @stdout = stdout
7
+ @stderr = stderr
8
+ super(message)
9
+ end
10
+
11
+ def message
12
+ messages = []
13
+ messages << "std_out: #{truncate(@stdout)}" if @stdout
14
+ messages << "std_err: #{truncate(@stderr)}" if @stderr
15
+ messages.join(" ")
16
+ end
17
+
18
+ private
19
+
20
+ def truncate(message)
21
+ message.slice(0, 200)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Biscuit
4
+ class SecretsDecrypter
5
+ attr_reader :secrets_file
6
+
7
+ def initialize(secrets_file)
8
+ fail "#{secrets_file} is not found" unless File.exists? secrets_file
9
+
10
+ @secrets_file = secrets_file
11
+ end
12
+
13
+ def load(&block)
14
+ if block_given?
15
+ secrets.each{ |key, value|
16
+ block.call(key, value)
17
+ }
18
+ else
19
+ secrets
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def secrets
26
+ @_secrets ||= YAML.load(exported)
27
+ end
28
+
29
+ def exported
30
+ @_exported ||= Biscuit.run!("export -f '#{secrets_file}'")
31
+ end
32
+
33
+ def secret_lines
34
+ @_secret_lines ||= exported.split("\n").select { |line| line =~ /\S/ }
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module Biscuit
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,54 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: biscuit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Suan-Aik Yeo
8
- autorequire:
8
+ - Justin Aiken
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-11-08 00:00:00.000000000 Z
12
+ date: 2021-06-02 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ~>
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.9'
20
+ version: '2.1'
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ~>
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '1.9'
27
+ version: '2.1'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rake
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ~>
32
+ - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: '10.0'
34
+ version: '13.0'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ~>
39
+ - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: '10.0'
41
+ version: '13.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
41
56
  description: Ruby wrapper for biscuit (https://github.com/dcoker/biscuit).
42
57
  email:
43
58
  - yeosuanaik@gmail.com
59
+ - 60tonangel@gmail.com
44
60
  executables:
45
61
  - biscuit
46
62
  extensions:
47
63
  - Rakefile
48
64
  extra_rdoc_files: []
49
65
  files:
50
- - .gitignore
66
+ - ".github/workflows/publish_gem.yml"
67
+ - ".gitignore"
68
+ - ".rspec"
69
+ - ".travis.yml"
70
+ - CHANGELOG.markdown
51
71
  - Gemfile
72
+ - LICENSE
52
73
  - README.md
53
74
  - Rakefile
54
75
  - bin/biscuit
@@ -56,30 +77,30 @@ files:
56
77
  - bin/setup
57
78
  - biscuit.gemspec
58
79
  - lib/biscuit.rb
80
+ - lib/biscuit/execution_error.rb
81
+ - lib/biscuit/secrets_decrypter.rb
59
82
  - lib/biscuit/version.rb
60
83
  homepage: https://github.com/usertesting/biscuit
61
- licenses: []
62
- metadata:
63
- allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
64
- post_install_message:
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
65
88
  rdoc_options: []
66
89
  require_paths:
67
90
  - lib
68
91
  required_ruby_version: !ruby/object:Gem::Requirement
69
92
  requirements:
70
- - - '>='
93
+ - - ">="
71
94
  - !ruby/object:Gem::Version
72
95
  version: '0'
73
96
  required_rubygems_version: !ruby/object:Gem::Requirement
74
97
  requirements:
75
- - - '>='
98
+ - - ">="
76
99
  - !ruby/object:Gem::Version
77
100
  version: '0'
78
101
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.0.14
81
- signing_key:
102
+ rubygems_version: 3.2.3
103
+ signing_key:
82
104
  specification_version: 4
83
105
  summary: Ruby wrapper for biscuit (https://github.com/dcoker/biscuit).
84
106
  test_files: []
85
- has_rdoc: