trocla-ruby2 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +10 -0
  5. data/CHANGELOG.md +71 -0
  6. data/Gemfile +51 -0
  7. data/LICENSE.txt +15 -0
  8. data/README.md +351 -0
  9. data/Rakefile +53 -0
  10. data/bin/trocla +148 -0
  11. data/ext/redhat/rubygem-trocla.spec +120 -0
  12. data/lib/VERSION +4 -0
  13. data/lib/trocla.rb +162 -0
  14. data/lib/trocla/default_config.yaml +47 -0
  15. data/lib/trocla/encryptions.rb +54 -0
  16. data/lib/trocla/encryptions/none.rb +10 -0
  17. data/lib/trocla/encryptions/ssl.rb +51 -0
  18. data/lib/trocla/formats.rb +54 -0
  19. data/lib/trocla/formats/bcrypt.rb +7 -0
  20. data/lib/trocla/formats/md5crypt.rb +6 -0
  21. data/lib/trocla/formats/mysql.rb +6 -0
  22. data/lib/trocla/formats/pgsql.rb +7 -0
  23. data/lib/trocla/formats/plain.rb +7 -0
  24. data/lib/trocla/formats/sha1.rb +7 -0
  25. data/lib/trocla/formats/sha256crypt.rb +6 -0
  26. data/lib/trocla/formats/sha512crypt.rb +6 -0
  27. data/lib/trocla/formats/ssha.rb +9 -0
  28. data/lib/trocla/formats/sshkey.rb +46 -0
  29. data/lib/trocla/formats/x509.rb +197 -0
  30. data/lib/trocla/store.rb +80 -0
  31. data/lib/trocla/stores.rb +39 -0
  32. data/lib/trocla/stores/memory.rb +56 -0
  33. data/lib/trocla/stores/moneta.rb +58 -0
  34. data/lib/trocla/util.rb +71 -0
  35. data/lib/trocla/version.rb +22 -0
  36. data/spec/data/.keep +0 -0
  37. data/spec/spec_helper.rb +290 -0
  38. data/spec/trocla/encryptions/none_spec.rb +22 -0
  39. data/spec/trocla/encryptions/ssl_spec.rb +26 -0
  40. data/spec/trocla/formats/x509_spec.rb +375 -0
  41. data/spec/trocla/store/memory_spec.rb +6 -0
  42. data/spec/trocla/store/moneta_spec.rb +6 -0
  43. data/spec/trocla/util_spec.rb +54 -0
  44. data/spec/trocla_spec.rb +248 -0
  45. data/trocla-ruby2.gemspec +104 -0
  46. metadata +202 -0
@@ -0,0 +1,248 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Trocla" do
4
+
5
+ before(:each) do
6
+ expect_any_instance_of(Trocla).to receive(:read_config).and_return(test_config)
7
+ end
8
+ context 'in normal usage with' do
9
+ before(:each) do
10
+ @trocla = Trocla.new
11
+ @trocla.password('init','plain')
12
+ end
13
+
14
+ describe "password" do
15
+ it "generates random passwords by default" do
16
+ expect(@trocla.password('random1','plain')).not_to eq(@trocla.password('random2','plain'))
17
+ end
18
+
19
+ it "generates passwords of length #{default_config['options']['length']}" do
20
+ expect(@trocla.password('random1','plain').length).to eq(default_config['options']['length'])
21
+ end
22
+
23
+ Trocla::Formats.all.each do |format|
24
+ describe "#{format} password format" do
25
+ it "retursn a password hashed in the #{format} format" do
26
+ expect(@trocla.password('some_test',format,format_options[format])).not_to be_empty
27
+ end
28
+
29
+ it "returns the same hashed for the #{format} format on multiple invocations" do
30
+ expect(round1=@trocla.password('some_test',format,format_options[format])).not_to be_empty
31
+ expect(@trocla.password('some_test',format,format_options[format])).to eq(round1)
32
+ end
33
+
34
+ it "also stores the plain password by default" do
35
+ pwd = @trocla.password('some_test','plain')
36
+ expect(pwd).not_to be_empty
37
+ expect(pwd.length).to eq(16)
38
+ end
39
+ end
40
+ end
41
+
42
+ Trocla::Formats.all.reject{|f| f == 'plain' }.each do |format|
43
+ it "raises an exception if not a random password is asked but plain password is not present for format #{format}" do
44
+ expect{@trocla.password('not_random',format, 'random' => false)}.to raise_error(/Password must be present as plaintext/)
45
+ end
46
+ end
47
+
48
+ describe 'with profiles' do
49
+ it 'raises an exception on unknown profile' do
50
+ expect{@trocla.password('no profile known','plain',
51
+ 'profiles' => 'unknown_profile') }.to raise_error(/No such profile unknown_profile defined/)
52
+ end
53
+
54
+ it 'takes a profile and merge its options' do
55
+ pwd = @trocla.password('some_test','plain', 'profiles' => 'rootpw')
56
+ expect(pwd).not_to be_empty
57
+ expect(pwd.length).to eq(32)
58
+ expect(pwd).to_not match(/[={}\[\]\?%\*()&!]+/)
59
+ end
60
+
61
+ it 'is possible to combine profiles but first profile wins' do
62
+ pwd = @trocla.password('some_test1','plain', 'profiles' => ['rootpw','login'])
63
+ expect(pwd).not_to be_empty
64
+ expect(pwd.length).to eq(32)
65
+ expect(pwd).not_to match(/[={}\[\]\?%\*()&!]+/)
66
+ end
67
+ it 'is possible to combine profiles but first profile wins 2' do
68
+ pwd = @trocla.password('some_test2','plain', 'profiles' => ['login','mysql'])
69
+ expect(pwd).not_to be_empty
70
+ expect(pwd.length).to eq(16)
71
+ expect(pwd).not_to match(/[={}\[\]\?%\*()&!]+/)
72
+ end
73
+ it 'is possible to combine profiles but first profile wins 3' do
74
+ pwd = @trocla.password('some_test3','plain', 'profiles' => ['mysql','login'])
75
+ expect(pwd).not_to be_empty
76
+ expect(pwd.length).to eq(32)
77
+ expect(pwd).to match(/[+%\/@=\?_.,:]+/)
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "set_password" do
83
+ it "resets hashed passwords on a new plain password" do
84
+ expect(@trocla.password('set_test','mysql')).not_to be_empty
85
+ expect(@trocla.get_password('set_test','mysql')).not_to be_nil
86
+ expect(old_plain=@trocla.password('set_test','mysql')).not_to be_empty
87
+
88
+ expect(@trocla.set_password('set_test','plain','foobar')).not_to eq(old_plain)
89
+ expect(@trocla.get_password('set_test','mysql')).to be_nil
90
+ end
91
+
92
+ it "otherwise updates only the hash" do
93
+ expect(mysql = @trocla.password('set_test2','mysql')).not_to be_empty
94
+ expect(md5crypt = @trocla.password('set_test2','md5crypt')).not_to be_empty
95
+ expect(plain = @trocla.get_password('set_test2','plain')).not_to be_empty
96
+
97
+ expect(new_mysql = @trocla.set_password('set_test2','mysql','foo')).not_to eql(mysql)
98
+ expect(@trocla.get_password('set_test2','mysql')).to eq(new_mysql)
99
+ expect(@trocla.get_password('set_test2','md5crypt')).to eq(md5crypt)
100
+ expect(@trocla.get_password('set_test2','plain')).to eq(plain)
101
+ end
102
+ end
103
+
104
+ describe "reset_password" do
105
+ it "resets a password" do
106
+ plain1 = @trocla.password('reset_pwd','plain')
107
+ plain2 = @trocla.reset_password('reset_pwd','plain')
108
+
109
+ expect(plain1).not_to eq(plain2)
110
+ end
111
+
112
+ it "does not reset other formats" do
113
+ expect(mysql = @trocla.password('reset_pwd2','mysql')).not_to be_empty
114
+ expect(md5crypt1 = @trocla.password('reset_pwd2','md5crypt')).not_to be_empty
115
+
116
+ expect(md5crypt2 = @trocla.reset_password('reset_pwd2','md5crypt')).not_to be_empty
117
+ expect(md5crypt2).not_to eq(md5crypt1)
118
+
119
+ expect(@trocla.get_password('reset_pwd2','mysql')).to eq(mysql)
120
+ end
121
+ end
122
+
123
+ describe "delete_password" do
124
+ it "deletes all passwords if no format is given" do
125
+ expect(@trocla.password('delete_test1','mysql')).not_to be_nil
126
+ expect(@trocla.get_password('delete_test1','plain')).not_to be_nil
127
+
128
+ @trocla.delete_password('delete_test1')
129
+ expect(@trocla.get_password('delete_test1','plain')).to be_nil
130
+ expect(@trocla.get_password('delete_test1','mysql')).to be_nil
131
+ end
132
+
133
+ it "deletes only a given format" do
134
+ expect(@trocla.password('delete_test2','mysql')).not_to be_nil
135
+ expect(@trocla.get_password('delete_test2','plain')).not_to be_nil
136
+
137
+ @trocla.delete_password('delete_test2','plain')
138
+ expect(@trocla.get_password('delete_test2','plain')).to be_nil
139
+ expect(@trocla.get_password('delete_test2','mysql')).not_to be_nil
140
+ end
141
+
142
+ it "deletes only a given non-plain format" do
143
+ expect(@trocla.password('delete_test3','mysql')).not_to be_nil
144
+ expect(@trocla.get_password('delete_test3','plain')).not_to be_nil
145
+
146
+ @trocla.delete_password('delete_test3','mysql')
147
+ expect(@trocla.get_password('delete_test3','mysql')).to be_nil
148
+ expect(@trocla.get_password('delete_test3','plain')).not_to be_nil
149
+ end
150
+ end
151
+
152
+ context 'concurrent access' do
153
+ context 'on expensive flagged formats' do
154
+ before(:each) do
155
+ expect(Trocla::Formats).to receive(:[]).with('sleep').at_least(:once).and_return(Trocla::Formats::Sleep)
156
+ expect(Trocla::Formats::Sleep).to receive(:expensive?).at_least(:once).and_return(true)
157
+ expect(Trocla::Formats).to receive(:available?).with('sleep').at_least(:once).and_return(true)
158
+ end
159
+ it 'should not overwrite a value if it takes longer' do
160
+ t1 = Thread.new{ @trocla.password('threadpwd','sleep','sleep' => 4) }
161
+ t2 = Thread.new{ @trocla.password('threadpwd','sleep','sleep' => 1) }
162
+ pwd1 = t1.value
163
+ pwd2 = t2.value
164
+ real_value = @trocla.password('threadpwd','sleep')
165
+ # as t2 finished first this should win
166
+ expect(pwd1).to eql(pwd2)
167
+ expect(real_value).to eql(pwd1)
168
+ expect(real_value).to eql(pwd2)
169
+ end
170
+ end
171
+ context 'on inexpensive flagged formats' do
172
+ before(:each) do
173
+ expect(Trocla::Formats).to receive(:[]).with('sleep').at_least(:once).and_return(Trocla::Formats::Sleep)
174
+ expect(Trocla::Formats::Sleep).to receive(:expensive?).at_least(:once).and_return(false)
175
+ expect(Trocla::Formats).to receive(:available?).with('sleep').at_least(:once).and_return(true)
176
+ end
177
+ it 'should not overwrite a value if it takes longer' do
178
+ t1 = Thread.new{ @trocla.password('threadpwd_inexp','sleep','sleep' => 4) }
179
+ t2 = Thread.new{ @trocla.password('threadpwd_inexp','sleep','sleep' => 1) }
180
+ pwd1 = t1.value
181
+ pwd2 = t2.value
182
+ real_value = @trocla.password('threadpwd_inexp','sleep')
183
+ # as t2 finished first but the format is inexpensive it gets overwritten
184
+ expect(pwd1).not_to eql(pwd2)
185
+ expect(real_value).to eql(pwd1)
186
+ expect(real_value).not_to eql(pwd2)
187
+ end
188
+ end
189
+ context 'real world example' do
190
+ it 'should store the quicker one' do
191
+ t1 = Thread.new{ @trocla.password('threadpwd_real','bcrypt','cost' => 17) }
192
+ t2 = Thread.new{ @trocla.password('threadpwd_real','bcrypt') }
193
+ pwd1 = t1.value
194
+ pwd2 = t2.value
195
+ real_value = @trocla.password('threadpwd_real','bcrypt')
196
+ # t2 should still win but both should be the same
197
+ expect(pwd1).to eql(pwd2)
198
+ expect(real_value).to eql(pwd1)
199
+ expect(real_value).to eql(pwd2)
200
+ end
201
+ it 'should store the quicker one test 2' do
202
+ t1 = Thread.new{ @trocla.password('my_shiny_selfsigned_ca', 'x509', {
203
+ 'CN' => 'This is my self-signed certificate',
204
+ 'become_ca' => false,
205
+ }) }
206
+ t2 = Thread.new{ @trocla.password('my_shiny_selfsigned_ca', 'x509', {
207
+ 'CN' => 'This is my self-signed certificate',
208
+ 'become_ca' => false,
209
+ }) }
210
+ cert1 = t1.value
211
+ cert2 = t2.value
212
+ real_value = @trocla.password('my_shiny_selfsigned_ca','x509')
213
+ # t2 should still win but both should be the same
214
+ expect(cert1).to eql(cert2)
215
+ expect(real_value).to eql(cert1)
216
+ expect(real_value).to eql(cert2)
217
+ end
218
+ end
219
+ end
220
+
221
+ end
222
+ context 'with .open' do
223
+ it 'closes the connection with a block' do
224
+ expect_any_instance_of(Trocla::Stores::Memory).to receive(:close)
225
+ Trocla.open{|t|
226
+ t.password('plain_open','plain')
227
+ }
228
+ end
229
+ it 'keeps the connection without a block' do
230
+ expect_any_instance_of(Trocla::Stores::Memory).not_to receive(:close)
231
+ Trocla.open.password('plain_open','plain')
232
+ end
233
+ end
234
+
235
+ def format_options
236
+ @format_options ||= Hash.new({}).merge({
237
+ 'pgsql' => { 'username' => 'test' },
238
+ 'x509' => { 'CN' => 'test' },
239
+ })
240
+ end
241
+
242
+ end
243
+
244
+ describe "VERSION" do
245
+ it "returns a version" do
246
+ expect(Trocla::VERSION::STRING).not_to be_empty
247
+ end
248
+ end
@@ -0,0 +1,104 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: trocla 0.3.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "trocla-ruby2".freeze
9
+ s.version = "0.4.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["mh".freeze]
14
+ s.date = "2017-08-04"
15
+ s.description = "Trocla helps you to generate random passwords and to store them in various formats (plain, MD5, bcrypt) for later retrival.".freeze
16
+ s.email = "mh+trocla@immerda.ch".freeze
17
+ s.executables = ["trocla".freeze]
18
+ s.extra_rdoc_files = [
19
+ "LICENSE.txt",
20
+ "README.md"
21
+ ]
22
+ s.files = [
23
+ ".document",
24
+ ".rspec",
25
+ ".travis.yml",
26
+ "CHANGELOG.md",
27
+ "Gemfile",
28
+ "LICENSE.txt",
29
+ "README.md",
30
+ "Rakefile",
31
+ "bin/trocla",
32
+ "ext/redhat/rubygem-trocla.spec",
33
+ "lib/VERSION",
34
+ "lib/trocla.rb",
35
+ "lib/trocla/default_config.yaml",
36
+ "lib/trocla/encryptions.rb",
37
+ "lib/trocla/encryptions/none.rb",
38
+ "lib/trocla/encryptions/ssl.rb",
39
+ "lib/trocla/formats.rb",
40
+ "lib/trocla/formats/bcrypt.rb",
41
+ "lib/trocla/formats/md5crypt.rb",
42
+ "lib/trocla/formats/mysql.rb",
43
+ "lib/trocla/formats/pgsql.rb",
44
+ "lib/trocla/formats/plain.rb",
45
+ "lib/trocla/formats/sha1.rb",
46
+ "lib/trocla/formats/sha256crypt.rb",
47
+ "lib/trocla/formats/sha512crypt.rb",
48
+ "lib/trocla/formats/ssha.rb",
49
+ "lib/trocla/formats/sshkey.rb",
50
+ "lib/trocla/formats/x509.rb",
51
+ "lib/trocla/store.rb",
52
+ "lib/trocla/stores.rb",
53
+ "lib/trocla/stores/memory.rb",
54
+ "lib/trocla/stores/moneta.rb",
55
+ "lib/trocla/util.rb",
56
+ "lib/trocla/version.rb",
57
+ "spec/data/.keep",
58
+ "spec/spec_helper.rb",
59
+ "spec/trocla/encryptions/none_spec.rb",
60
+ "spec/trocla/encryptions/ssl_spec.rb",
61
+ "spec/trocla/formats/x509_spec.rb",
62
+ "spec/trocla/store/memory_spec.rb",
63
+ "spec/trocla/store/moneta_spec.rb",
64
+ "spec/trocla/util_spec.rb",
65
+ "spec/trocla_spec.rb",
66
+ "trocla-ruby2.gemspec"
67
+ ]
68
+ s.homepage = "https://tech.immerda.ch/2011/12/trocla-get-hashed-passwords-out-of-puppet-manifests/".freeze
69
+ s.licenses = ["GPLv3".freeze]
70
+ s.rubygems_version = "2.6.11".freeze
71
+ s.summary = "Trocla a simple password generator and storage".freeze
72
+
73
+ if s.respond_to? :specification_version then
74
+ s.specification_version = 4
75
+
76
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
77
+ s.add_runtime_dependency(%q<moneta>.freeze, [">= 0"])
78
+ s.add_runtime_dependency(%q<highline>.freeze, [">= 0"])
79
+ s.add_runtime_dependency(%q<bcrypt>.freeze, [">= 0"])
80
+ s.add_runtime_dependency(%q<sshkey>.freeze, [">= 0"])
81
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
82
+ s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
83
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
84
+ s.add_development_dependency(%q<rspec-pending_for>.freeze, [">= 0"])
85
+ else
86
+ s.add_dependency(%q<moneta>.freeze, [">= 0"])
87
+ s.add_dependency(%q<highline>.freeze, [">= 0"])
88
+ s.add_dependency(%q<bcrypt>.freeze, [">= 0"])
89
+ s.add_dependency(%q<rspec>.freeze, [">= 0"])
90
+ s.add_dependency(%q<rdoc>.freeze, [">= 0"])
91
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
92
+ s.add_dependency(%q<rspec-pending_for>.freeze, [">= 0"])
93
+ end
94
+ else
95
+ s.add_dependency(%q<moneta>.freeze, [">= 0"])
96
+ s.add_dependency(%q<highline>.freeze, [">= 0"])
97
+ s.add_dependency(%q<bcrypt>.freeze, [">= 0"])
98
+ s.add_dependency(%q<rspec>.freeze, [">= 0"])
99
+ s.add_dependency(%q<rdoc>.freeze, [">= 0"])
100
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
101
+ s.add_dependency(%q<rspec-pending_for>.freeze, [">= 0"])
102
+ end
103
+ end
104
+
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trocla-ruby2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - mh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: moneta
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: highline
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
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bcrypt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sshkey
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '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: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '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: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: jeweler
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: rspec-pending_for
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
+ description: Trocla helps you to generate random passwords and to store them in various
126
+ formats (plain, MD5, bcrypt) for later retrival.
127
+ email: mh+trocla@immerda.ch
128
+ executables:
129
+ - trocla
130
+ extensions: []
131
+ extra_rdoc_files:
132
+ - LICENSE.txt
133
+ - README.md
134
+ files:
135
+ - ".document"
136
+ - ".rspec"
137
+ - ".travis.yml"
138
+ - CHANGELOG.md
139
+ - Gemfile
140
+ - LICENSE.txt
141
+ - README.md
142
+ - Rakefile
143
+ - bin/trocla
144
+ - ext/redhat/rubygem-trocla.spec
145
+ - lib/VERSION
146
+ - lib/trocla.rb
147
+ - lib/trocla/default_config.yaml
148
+ - lib/trocla/encryptions.rb
149
+ - lib/trocla/encryptions/none.rb
150
+ - lib/trocla/encryptions/ssl.rb
151
+ - lib/trocla/formats.rb
152
+ - lib/trocla/formats/bcrypt.rb
153
+ - lib/trocla/formats/md5crypt.rb
154
+ - lib/trocla/formats/mysql.rb
155
+ - lib/trocla/formats/pgsql.rb
156
+ - lib/trocla/formats/plain.rb
157
+ - lib/trocla/formats/sha1.rb
158
+ - lib/trocla/formats/sha256crypt.rb
159
+ - lib/trocla/formats/sha512crypt.rb
160
+ - lib/trocla/formats/ssha.rb
161
+ - lib/trocla/formats/sshkey.rb
162
+ - lib/trocla/formats/x509.rb
163
+ - lib/trocla/store.rb
164
+ - lib/trocla/stores.rb
165
+ - lib/trocla/stores/memory.rb
166
+ - lib/trocla/stores/moneta.rb
167
+ - lib/trocla/util.rb
168
+ - lib/trocla/version.rb
169
+ - spec/data/.keep
170
+ - spec/spec_helper.rb
171
+ - spec/trocla/encryptions/none_spec.rb
172
+ - spec/trocla/encryptions/ssl_spec.rb
173
+ - spec/trocla/formats/x509_spec.rb
174
+ - spec/trocla/store/memory_spec.rb
175
+ - spec/trocla/store/moneta_spec.rb
176
+ - spec/trocla/util_spec.rb
177
+ - spec/trocla_spec.rb
178
+ - trocla-ruby2.gemspec
179
+ homepage: https://tech.immerda.ch/2011/12/trocla-get-hashed-passwords-out-of-puppet-manifests/
180
+ licenses:
181
+ - GPLv3
182
+ metadata: {}
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubygems_version: 3.0.3
199
+ signing_key:
200
+ specification_version: 4
201
+ summary: Trocla a simple password generator and storage
202
+ test_files: []