trocla-ruby2 0.4.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.
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: []