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.
- checksums.yaml +7 -0
- data/.document +4 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +71 -0
- data/Gemfile +51 -0
- data/LICENSE.txt +15 -0
- data/README.md +351 -0
- data/Rakefile +53 -0
- data/bin/trocla +148 -0
- data/ext/redhat/rubygem-trocla.spec +120 -0
- data/lib/VERSION +4 -0
- data/lib/trocla.rb +162 -0
- data/lib/trocla/default_config.yaml +47 -0
- data/lib/trocla/encryptions.rb +54 -0
- data/lib/trocla/encryptions/none.rb +10 -0
- data/lib/trocla/encryptions/ssl.rb +51 -0
- data/lib/trocla/formats.rb +54 -0
- data/lib/trocla/formats/bcrypt.rb +7 -0
- data/lib/trocla/formats/md5crypt.rb +6 -0
- data/lib/trocla/formats/mysql.rb +6 -0
- data/lib/trocla/formats/pgsql.rb +7 -0
- data/lib/trocla/formats/plain.rb +7 -0
- data/lib/trocla/formats/sha1.rb +7 -0
- data/lib/trocla/formats/sha256crypt.rb +6 -0
- data/lib/trocla/formats/sha512crypt.rb +6 -0
- data/lib/trocla/formats/ssha.rb +9 -0
- data/lib/trocla/formats/sshkey.rb +46 -0
- data/lib/trocla/formats/x509.rb +197 -0
- data/lib/trocla/store.rb +80 -0
- data/lib/trocla/stores.rb +39 -0
- data/lib/trocla/stores/memory.rb +56 -0
- data/lib/trocla/stores/moneta.rb +58 -0
- data/lib/trocla/util.rb +71 -0
- data/lib/trocla/version.rb +22 -0
- data/spec/data/.keep +0 -0
- data/spec/spec_helper.rb +290 -0
- data/spec/trocla/encryptions/none_spec.rb +22 -0
- data/spec/trocla/encryptions/ssl_spec.rb +26 -0
- data/spec/trocla/formats/x509_spec.rb +375 -0
- data/spec/trocla/store/memory_spec.rb +6 -0
- data/spec/trocla/store/moneta_spec.rb +6 -0
- data/spec/trocla/util_spec.rb +54 -0
- data/spec/trocla_spec.rb +248 -0
- data/trocla-ruby2.gemspec +104 -0
- metadata +202 -0
data/spec/trocla_spec.rb
ADDED
@@ -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: []
|