shadow_db_credentials 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.idea/jenkinsSettings.xml +9 -0
- data/.idea/misc.xml +2 -1
- data/.idea/shadow_db_credentials.iml +22 -10
- data/.idea/workspace.xml +303 -75
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGES +9 -1
- data/Gemfile +8 -7
- data/README.md +125 -3
- data/Rakefile +14 -10
- data/lib/shadow_db_credentials.rb +1 -0
- data/lib/shadow_db_credentials/shadow_db_credentials.rb +24 -15
- data/lib/shadow_db_credentials/version.rb +2 -2
- data/shadow_db_credentials.gemspec +2 -1
- data/shadow_db_credentials.gemspec.erb +1 -1
- data/spec/shadow_db_credentials_spec.rb +29 -8
- data/spec/spec_helper.rb +0 -9
- metadata +14 -18
- data/.rvmrc +0 -4
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
shadow_db_credentials
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/CHANGES
CHANGED
data/Gemfile
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
source
|
2
|
-
|
3
|
-
group :default do
|
4
|
-
|
5
|
-
end
|
1
|
+
source 'https://rubygems.org'
|
6
2
|
|
7
3
|
group :development do
|
8
4
|
gem "gemspec_deps_gen"
|
@@ -10,6 +6,11 @@ group :development do
|
|
10
6
|
end
|
11
7
|
|
12
8
|
group :test do
|
13
|
-
gem "rspec"
|
14
|
-
gem "mocha"
|
9
|
+
gem "rspec"
|
10
|
+
gem "mocha"
|
11
|
+
end
|
12
|
+
|
13
|
+
group :debug do
|
14
|
+
#gem "ruby-debug-base19x", "0.11.30.pre12"
|
15
|
+
gem "ruby-debug-ide", "0.4.17"
|
15
16
|
end
|
data/README.md
CHANGED
@@ -1,4 +1,126 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Shadow DB Credentials
|
2
|
+
|
3
|
+
## Helps to keep DB credentials for rails app in private place
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to to your Gemfile:
|
8
|
+
|
9
|
+
gem "shadow_db_credentials"
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Create "shadowed" credentials file (**your_prod_credentials**) inside some directory (e.g. **~/.credentials**):
|
18
|
+
|
19
|
+
```yml
|
20
|
+
username: your_username
|
21
|
+
password: your_password
|
22
|
+
```
|
23
|
+
|
24
|
+
The location of your **credentials directory** is controlled by **CREDENTIALS_DIR** environment
|
25
|
+
variable. Register it in **config/initializers/env_variables.rb** file:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
ENV['CREDENTIALS_DIR'] ||= "#{ENV['HOME']}/.credentials"
|
29
|
+
```
|
30
|
+
|
31
|
+
If you want to have different **credentials directory** per environment, define it in corresponding env file:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# config/environments/development.rb
|
35
|
+
...
|
36
|
+
ENV['CREDENTIALS_DIR'] ||= "#{ENV['HOME']}/.credentials"
|
37
|
+
```
|
38
|
+
|
39
|
+
Remove all the credentials (username/password) that you don't want to keep inside **config/database.yml**
|
40
|
+
and replace them with single **credentials** attriubute. It points to the name of credentials file
|
41
|
+
(**your_prod_credentials**):
|
42
|
+
|
43
|
+
```yml
|
44
|
+
development:
|
45
|
+
adapter: postgresql
|
46
|
+
database: your_dev_db
|
47
|
+
credentials: your_dev_credentials
|
48
|
+
|
49
|
+
production:
|
50
|
+
adapter: postgresql
|
51
|
+
database: your_prod_db
|
52
|
+
credentials: your_prod_credentials
|
53
|
+
```
|
54
|
+
|
55
|
+
If you want, you can also move other sensitive information, such as database name, url etc.
|
56
|
+
|
57
|
+
Next, you have to create code hook inside rails **config/application.rb** in order to call gem's API:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require 'shadow_db_credentials'
|
61
|
+
|
62
|
+
...
|
63
|
+
|
64
|
+
module YourRailsApp
|
65
|
+
class Application < Rails::Application
|
66
|
+
...
|
67
|
+
|
68
|
+
def config.database_configuration
|
69
|
+
orig_db_configurations = super
|
70
|
+
|
71
|
+
processor = ShadowDbCredentials.new(ENV['CREDENTIALS_DIR'])
|
72
|
+
|
73
|
+
processor.process_configurations(orig_db_configurations)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
79
|
+
The hook will access original DB configuration and try to expand all **credentials** attributes
|
80
|
+
with corresponding values dynamically, at run time.
|
81
|
+
|
82
|
+
You can check result of your work:
|
83
|
+
|
84
|
+
```bash
|
85
|
+
$ rails console production
|
86
|
+
|
87
|
+
> ActiveRecord::Base.configurations["production"]
|
88
|
+
=> {"adapter"=>"postgresql", "username"=>"your_username", "password"=>"your_password"}
|
89
|
+
|
90
|
+
> Rails.application.config.database_configuration['production']
|
91
|
+
=> {"adapter"=>"postgresql", "username"=>"your_username", "password"=>"your_password"}
|
92
|
+
```
|
93
|
+
|
94
|
+
Or you can get it with API call:
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
require 'shadow_db_credentials'
|
98
|
+
|
99
|
+
credentials_dir = ENV['CREDENTIALS_DIR']
|
100
|
+
processor = ShadowDbCredentials.new(credentials_dir)
|
101
|
+
|
102
|
+
# 1. get production hash, read configuration from default location
|
103
|
+
|
104
|
+
connection_hash1 = processor.retrieve_configuration "production"
|
105
|
+
connection_hash1.inspect
|
106
|
+
|
107
|
+
# 2. get development hash, read configuration from dynamic source
|
108
|
+
|
109
|
+
source = StringIO.new <<-TEXT
|
110
|
+
development:
|
111
|
+
adapter: postgresql
|
112
|
+
credentials: your_dev_db
|
113
|
+
TEXT
|
114
|
+
|
115
|
+
connection_hash2 = processor.retrieve_configuration 'development', source
|
116
|
+
connection_has2.inspect
|
117
|
+
```
|
118
|
+
|
119
|
+
## Contributing
|
120
|
+
|
121
|
+
1. Fork it
|
122
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
123
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
124
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
125
|
+
5. Create new Pull Request
|
3
126
|
|
4
|
-
Class that helps to keep database credentials for rails application in private place
|
data/Rakefile
CHANGED
@@ -6,20 +6,25 @@ require "rspec/core/rake_task"
|
|
6
6
|
require "shadow_db_credentials/version"
|
7
7
|
require "gemspec_deps_gen/gemspec_deps_gen"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
version = ShadowDbCredentials::VERSION
|
10
|
+
project_name = File.basename(Dir.pwd)
|
11
|
+
|
12
|
+
task :gen do
|
13
|
+
generator = GemspecDepsGen.new project_name
|
12
14
|
|
13
|
-
|
14
|
-
File.basename(Dir.pwd)
|
15
|
+
generator.generate_dependencies "spec", "#{project_name}.gemspec.erb", "#{project_name}.gemspec"
|
15
16
|
end
|
16
17
|
|
17
|
-
task :build do
|
18
|
-
|
18
|
+
task :build => :gen do
|
19
|
+
system "gem build #{project_name}.gemspec"
|
20
|
+
end
|
19
21
|
|
20
|
-
|
22
|
+
task :install do
|
23
|
+
system "gem install #{project_name}-#{version}.gem"
|
24
|
+
end
|
21
25
|
|
22
|
-
|
26
|
+
task :uninstall do
|
27
|
+
system "gem uninstall #{project_name}"
|
23
28
|
end
|
24
29
|
|
25
30
|
task :release => :build do
|
@@ -31,4 +36,3 @@ RSpec::Core::RakeTask.new do |task|
|
|
31
36
|
task.verbose = false
|
32
37
|
end
|
33
38
|
|
34
|
-
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
1
3
|
class ShadowDbCredentials
|
2
4
|
|
3
5
|
def initialize credentials_dir
|
@@ -9,12 +11,12 @@ class ShadowDbCredentials
|
|
9
11
|
|
10
12
|
template = ERB.new file.read
|
11
13
|
|
12
|
-
config = YAML.load(template.result(binding))
|
14
|
+
config = indifferent_access(YAML.load(template.result(binding)))
|
13
15
|
|
14
|
-
process_credentials(config[rails_env])
|
16
|
+
process_credentials(config[rails_env.to_sym])
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
19
|
+
def process_configurations configurations
|
18
20
|
new_configurations = {}
|
19
21
|
|
20
22
|
configurations.each do |name, params|
|
@@ -24,24 +26,16 @@ class ShadowDbCredentials
|
|
24
26
|
new_configurations
|
25
27
|
end
|
26
28
|
|
27
|
-
def process_configuration configurations, rails_env
|
28
|
-
new_configurations = configurations.clone
|
29
|
-
|
30
|
-
new_configurations[rails_env] = process_credentials(configurations[rails_env])
|
31
|
-
|
32
|
-
new_configurations
|
33
|
-
end
|
34
|
-
|
35
29
|
private
|
36
30
|
|
37
31
|
def process_credentials params
|
38
|
-
if params[
|
39
|
-
credentials = params.delete(
|
32
|
+
if params[:credentials]
|
33
|
+
credentials = params.delete(:credentials)
|
40
34
|
|
41
|
-
file_name = "
|
35
|
+
file_name = "#{@credentials_dir}/#{credentials}"
|
42
36
|
|
43
37
|
if File.exist? file_name
|
44
|
-
params.merge!(YAML.load_file(file_name))
|
38
|
+
params.merge!(indifferent_access(YAML.load_file(file_name)))
|
45
39
|
else
|
46
40
|
puts "Missing credentials file: #{file_name}."
|
47
41
|
end
|
@@ -49,5 +43,20 @@ class ShadowDbCredentials
|
|
49
43
|
|
50
44
|
params
|
51
45
|
end
|
46
|
+
|
47
|
+
def indifferent_access hash
|
48
|
+
case hash
|
49
|
+
when Hash
|
50
|
+
Hash[
|
51
|
+
hash.map do |k, v|
|
52
|
+
[ k.respond_to?(:to_sym) ? k.to_sym : k, indifferent_access(v) ]
|
53
|
+
end
|
54
|
+
]
|
55
|
+
when Enumerable
|
56
|
+
hash.map { |v| indifferent_access(v) }
|
57
|
+
else
|
58
|
+
hash
|
59
|
+
end
|
60
|
+
end
|
52
61
|
end
|
53
62
|
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "1.0
|
1
|
+
class ShadowDbCredentials
|
2
|
+
VERSION = "1.1.0"
|
3
3
|
end
|
@@ -4,17 +4,38 @@ require 'shadow_db_credentials'
|
|
4
4
|
require 'yaml'
|
5
5
|
|
6
6
|
describe ShadowDbCredentials do
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
before do
|
8
|
+
@credentials_dir = 'some_credentials_dir'
|
9
|
+
|
10
|
+
credentials_file_name = "#{@credentials_dir}/your_dev_db"
|
11
|
+
|
12
|
+
YAML.expects(:load_file).with(credentials_file_name).returns(
|
13
|
+
{url: "some_url", username: "username", password: "password"}
|
10
14
|
)
|
15
|
+
File.expects(:exist? => true).with(credentials_file_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
subject do
|
19
|
+
ShadowDbCredentials.new(@credentials_dir)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should process credentials attrubute" do
|
23
|
+
configurations = {production: { adapter: 'oracle_enhanced', credentials: 'your_dev_db'}}
|
11
24
|
|
12
|
-
|
25
|
+
result = subject.process_configurations configurations
|
26
|
+
|
27
|
+
result[:production][:url].should == 'some_url'
|
28
|
+
end
|
13
29
|
|
14
|
-
|
30
|
+
it "should retrieve given configuration" do
|
31
|
+
source = StringIO.new <<-TEXT
|
32
|
+
development:
|
33
|
+
adapter: postgresql
|
34
|
+
credentials: your_dev_db
|
35
|
+
TEXT
|
15
36
|
|
16
|
-
result = subject.
|
37
|
+
result = subject.retrieve_configuration "development", source
|
17
38
|
|
18
|
-
result[
|
39
|
+
result[:development][:url].should == 'some_url'
|
19
40
|
end
|
20
|
-
end
|
41
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,5 @@
|
|
1
1
|
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
|
-
# ## Mock Framework
|
5
|
-
#
|
6
|
-
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
7
|
-
|
8
4
|
config.mock_with :mocha
|
9
|
-
#config.mock_with :rspec
|
10
|
-
|
11
|
-
# config.mock_with :flexmock
|
12
|
-
# config.mock_with :rr
|
13
|
-
|
14
5
|
end
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shadow_db_credentials
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Alexander Shvets
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: gemspec_deps_gen
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: gemcutter
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: Class that helps to keep database credentials for rails application in
|
@@ -55,13 +50,15 @@ files:
|
|
55
50
|
- .idea/.rakeTasks
|
56
51
|
- .idea/cssxfire.xml
|
57
52
|
- .idea/encodings.xml
|
53
|
+
- .idea/jenkinsSettings.xml
|
58
54
|
- .idea/misc.xml
|
59
55
|
- .idea/modules.xml
|
60
56
|
- .idea/scopes/scope_settings.xml
|
61
57
|
- .idea/shadow_db_credentials.iml
|
62
58
|
- .idea/vcs.xml
|
63
59
|
- .idea/workspace.xml
|
64
|
-
- .
|
60
|
+
- .ruby-gemset
|
61
|
+
- .ruby-version
|
65
62
|
- CHANGES
|
66
63
|
- Gemfile
|
67
64
|
- LICENSE
|
@@ -76,27 +73,26 @@ files:
|
|
76
73
|
- spec/spec_helper.rb
|
77
74
|
homepage: http://github.com/shvets/shadow_db_credentials
|
78
75
|
licenses: []
|
76
|
+
metadata: {}
|
79
77
|
post_install_message:
|
80
78
|
rdoc_options: []
|
81
79
|
require_paths:
|
82
80
|
- lib
|
83
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
82
|
requirements:
|
86
|
-
- -
|
83
|
+
- - '>='
|
87
84
|
- !ruby/object:Gem::Version
|
88
85
|
version: '0'
|
89
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
87
|
requirements:
|
92
|
-
- -
|
88
|
+
- - '>='
|
93
89
|
- !ruby/object:Gem::Version
|
94
90
|
version: '0'
|
95
91
|
requirements: []
|
96
92
|
rubyforge_project:
|
97
|
-
rubygems_version:
|
93
|
+
rubygems_version: 2.0.5
|
98
94
|
signing_key:
|
99
|
-
specification_version:
|
95
|
+
specification_version: 4
|
100
96
|
summary: Class that helps to keep database credentials for rails application in private
|
101
97
|
place
|
102
98
|
test_files:
|