pog19 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +45 -0
- data/LICENSE +201 -0
- data/NOTICE +12 -0
- data/README +66 -0
- data/Rakefile +121 -0
- data/SECURITY +36 -0
- data/VERSION +1 -0
- data/lib/character_ranges.rb +185 -0
- data/lib/encoding_translation.rb +53 -0
- data/lib/password.rb +329 -0
- data/lib/password_tests.rb +415 -0
- data/lib/pog.rb +21 -0
- data/lib/random_string_generator.rb +291 -0
- data/lib/salt.rb +135 -0
- data/lib/string.rb +15 -0
- data/pog1-9.gemspec +20 -0
- data/test/tc_password.rb +122 -0
- data/test/tc_password_tests.rb +209 -0
- data/test/tc_random_string_generator.rb +133 -0
- data/test/tc_salt.rb +78 -0
- metadata +84 -0
@@ -0,0 +1,209 @@
|
|
1
|
+
# Copyright (c) 2007 Operis Systems, LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
require 'test/unit'
|
15
|
+
require File.join( File.dirname(__FILE__), '..', 'lib', 'pog.rb' )
|
16
|
+
|
17
|
+
class TC_PasswordTests < Test::Unit::TestCase
|
18
|
+
def test_length
|
19
|
+
tests = get_password_tests({ :bad => 'fubar', :good => 'foobar', :extra_good => 'foobar0' },
|
20
|
+
{ :test_length => 6 })
|
21
|
+
|
22
|
+
make_assertions_on_tests tests, :test_length
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_minimum_alphas
|
26
|
+
tests = get_password_tests({ :bad => 'f00', :good => 'fo0', :extra_good => 'foo' },
|
27
|
+
{ :test_minimum_alphas => 2 })
|
28
|
+
|
29
|
+
make_assertions_on_tests tests, :test_minimum_alphas
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_maximum_alphas
|
33
|
+
tests = get_password_tests({ :bad => 'foo', :good => 'fo0', :extra_good => 'f00' },
|
34
|
+
{ :test_maximum_alphas => 2 })
|
35
|
+
|
36
|
+
make_assertions_on_tests tests, :test_maximum_alphas
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_minimum_upper_alphas
|
40
|
+
tests = get_password_tests({ :bad => 'Foo', :good => 'FOo', :extra_good => 'FOO' },
|
41
|
+
{ :test_minimum_upper_alphas => 2 })
|
42
|
+
|
43
|
+
make_assertions_on_tests tests, :test_minimum_upper_alphas
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_maximum_upper_alphas
|
47
|
+
tests = get_password_tests({ :bad => 'FOO', :good => 'FOo', :extra_good => 'Foo' },
|
48
|
+
{ :test_maximum_upper_alphas => 2 })
|
49
|
+
|
50
|
+
make_assertions_on_tests tests, :test_maximum_upper_alphas
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_minimum_lower_alphas
|
54
|
+
tests = get_password_tests({ :bad => 'FOo', :good => 'Foo', :extra_good => 'foo' },
|
55
|
+
{ :test_minimum_lower_alphas => 2 })
|
56
|
+
|
57
|
+
make_assertions_on_tests tests, :test_minimum_lower_alphas
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_maximum_lower_alphas
|
61
|
+
tests = get_password_tests({ :bad => 'foo', :good => 'Foo', :extra_good => 'FOo' },
|
62
|
+
{ :test_maximum_lower_alphas => 2 })
|
63
|
+
|
64
|
+
make_assertions_on_tests tests, :test_maximum_lower_alphas
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_minimum_numerals
|
68
|
+
tests = get_password_tests({ :bad => 'fo0', :good => 'f00', :extra_good => '000' },
|
69
|
+
{ :test_minimum_numerals => 2 })
|
70
|
+
|
71
|
+
make_assertions_on_tests tests, :test_minimum_numerals
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_maximum_numerals
|
75
|
+
tests = get_password_tests({ :bad => '000', :good => 'f00', :extra_good => 'fo0' },
|
76
|
+
{ :test_maximum_numerals => 2 })
|
77
|
+
|
78
|
+
make_assertions_on_tests tests, :test_maximum_numerals
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_minimum_non_alphanumeric
|
82
|
+
tests = get_password_tests({ :bad => 'fo@', :good => 'f@@', :extra_good => '@@@' },
|
83
|
+
{ :test_minimum_non_alphanumeric => 2 })
|
84
|
+
|
85
|
+
make_assertions_on_tests tests, :test_minimum_non_alphanumeric
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_maximum_non_alphanumeric
|
89
|
+
tests = get_password_tests({ :bad => '@@@', :good => 'f@@', :extra_good => 'fo@' },
|
90
|
+
{ :test_maximum_non_alphanumeric => 2 })
|
91
|
+
|
92
|
+
make_assertions_on_tests tests, :test_maximum_non_alphanumeric
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_maximum_non_alpha
|
96
|
+
tests = get_password_tests({ :bad => '@@@', :good => 'f@@', :extra_good => 'fo@' },
|
97
|
+
{ :test_maximum_non_alpha => 2 })
|
98
|
+
|
99
|
+
make_assertions_on_tests tests, :test_maximum_non_alpha
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_minimum_non_alpha
|
103
|
+
tests = get_password_tests({ :bad => 'foo', :good => 'f@@', :extra_good => 'fo@b#$' },
|
104
|
+
{ :test_minimum_non_alpha => 2 })
|
105
|
+
|
106
|
+
make_assertions_on_tests tests, :test_minimum_non_alpha
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_run
|
110
|
+
tests = PasswordTests.new( 'FooBar', :test_length => 8,
|
111
|
+
:test_minimum_alphas => 2 )
|
112
|
+
|
113
|
+
assert_equal({ :test_length => false,
|
114
|
+
:test_minimum_alphas => true }, tests.run)
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_repetitions
|
118
|
+
assert PasswordTests.repetitions('fobar').empty?
|
119
|
+
|
120
|
+
assert_equal( {'o'=>1},
|
121
|
+
PasswordTests.repetitions('foobar') )
|
122
|
+
|
123
|
+
assert_equal( {'o'=>3, 'oo'=>1},
|
124
|
+
PasswordTests.repetitions('fooboo') )
|
125
|
+
|
126
|
+
assert_equal( {'f' => 1, 'o'=>3, 'oo'=>1, 'foo'=>1},
|
127
|
+
PasswordTests.repetitions('foofoo') )
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_qualitative_strength
|
131
|
+
assert_operator 0, :== , PasswordTests.qualitative_strength( '123456' )
|
132
|
+
|
133
|
+
assert_operator 0, :== , PasswordTests.qualitative_strength( 'foo' )
|
134
|
+
|
135
|
+
assert_operator 0, :<= , PasswordTests.qualitative_strength( 'fooo' )
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_entropy
|
139
|
+
assert_operator 3.3, :< , PasswordTests.entropy( '1' )
|
140
|
+
|
141
|
+
assert_operator 4.7, :< , PasswordTests.entropy( 'f' )
|
142
|
+
|
143
|
+
assert_operator 5.0, :< ,PasswordTests.entropy( '$' )
|
144
|
+
|
145
|
+
assert_operator 6.6, :< ,PasswordTests.entropy( '12' )
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_default_levels
|
149
|
+
# low
|
150
|
+
assert_equal({:test_length=>true, :test_minimum_alphas=>false}, PasswordTests.new('123456', :low).run)
|
151
|
+
assert_equal({:test_length=>true, :test_minimum_alphas=>true}, PasswordTests.new('f123456', :low).run)
|
152
|
+
assert_equal({:test_length=>true, :test_minimum_alphas=>true}, PasswordTests.new('fo0bar', :low).run)
|
153
|
+
|
154
|
+
# medium-low
|
155
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>false, :test_minimum_alphas=>true},
|
156
|
+
PasswordTests.new('abcdefgh', :medium_low).run)
|
157
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>true, :test_minimum_alphas=>true},
|
158
|
+
PasswordTests.new('abcdefgh0', :medium_low).run)
|
159
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>true, :test_minimum_alphas=>true},
|
160
|
+
PasswordTests.new('fo0barf00', :medium_low).run)
|
161
|
+
|
162
|
+
# medium-high
|
163
|
+
assert_equal({:test_length=>true, :test_minimum_upper_alphas=>false, :test_minimum_non_alpha=>false, :test_minimum_lower_alphas=>true},
|
164
|
+
PasswordTests.new('abcdefgh', :medium_high).run)
|
165
|
+
assert_equal({:test_length=>true, :test_minimum_upper_alphas=>true, :test_minimum_non_alpha=>true, :test_minimum_lower_alphas=>true},
|
166
|
+
PasswordTests.new('Abcdefgh0', :medium_high).run)
|
167
|
+
assert_equal({:test_length=>true, :test_minimum_upper_alphas=>true, :test_minimum_non_alpha=>true, :test_minimum_lower_alphas=>true},
|
168
|
+
PasswordTests.new('fo0barF00', :medium_high).run)
|
169
|
+
|
170
|
+
# The default level should be medium_low
|
171
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>false, :test_minimum_alphas=>true}, PasswordTests.new('abcdefgh').run)
|
172
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>true, :test_minimum_alphas=>true}, PasswordTests.new('abcdefgh0').run)
|
173
|
+
assert_equal({:test_length=>true, :test_minimum_non_alpha=>true, :test_minimum_alphas=>true}, PasswordTests.new('fo0barf00').run)
|
174
|
+
|
175
|
+
# high
|
176
|
+
assert_equal({:test_minimum_numerals=>false, :test_length=>true, :test_minimum_upper_alphas=>false, :test_minimum_lower_alphas=>true,
|
177
|
+
:test_minimum_non_alphanumeric=>false}, PasswordTests.new('abcdefgh', :high).run)
|
178
|
+
assert_equal({:test_minimum_numerals=>true, :test_length=>true, :test_minimum_upper_alphas=>true, :test_minimum_lower_alphas=>true,
|
179
|
+
:test_minimum_non_alphanumeric=>true}, PasswordTests.new('Abcdefgh0#', :high).run)
|
180
|
+
assert_equal({:test_minimum_numerals=>true, :test_length=>true, :test_minimum_upper_alphas=>true, :test_minimum_lower_alphas=>true,
|
181
|
+
:test_minimum_non_alphanumeric=>true}, PasswordTests.new('fo0barF##', :high).run)
|
182
|
+
|
183
|
+
# invalid level
|
184
|
+
assert_raise(RuntimeError) { PasswordTests.new('fooey', :foobar) }
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
##
|
190
|
+
# Gets a hash of PasswordTests classes for each of the given passwords in the
|
191
|
+
# test_password_hash with the given test_hash
|
192
|
+
#
|
193
|
+
def get_password_tests( test_password_hash , test_hash )
|
194
|
+
tests = Hash.new { |hash, key|
|
195
|
+
hash[key] = PasswordTests.new( test_password_hash[key], test_hash ) }
|
196
|
+
test_password_hash.each_key { |name| tests[name] }
|
197
|
+
return tests
|
198
|
+
end
|
199
|
+
|
200
|
+
##
|
201
|
+
# Executes the given method on the cases :bad, :good, and :extra_good and
|
202
|
+
# asserts that :bad is false, and :good and :extra_good are true
|
203
|
+
#
|
204
|
+
def make_assertions_on_tests( tests, method )
|
205
|
+
assert_equal false, tests[:bad].__send__( method )
|
206
|
+
assert_equal true, tests[:good].__send__( method )
|
207
|
+
assert_equal true, tests[:extra_good].__send__( method )
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# Copyright (c) 2007 Operis Systems, LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
require 'test/unit'
|
15
|
+
require File.join( File.dirname(__FILE__), '..', 'lib', 'pog.rb' )
|
16
|
+
|
17
|
+
class TC_PasswordTests < Test::Unit::TestCase
|
18
|
+
def test_shuffle_string
|
19
|
+
str = "qwertyuiopQWERTYUIOP"
|
20
|
+
str_freq = frequencies(str)
|
21
|
+
str_2 = RandomStringGenerator.shuffle_string str
|
22
|
+
assert_not_equal str_2, str
|
23
|
+
assert_equal frequencies(str_2), frequencies(str)
|
24
|
+
end
|
25
|
+
|
26
|
+
def frequencies( str )
|
27
|
+
r = {}
|
28
|
+
for i in 0...str.length do
|
29
|
+
c = str[i]
|
30
|
+
if r[c]
|
31
|
+
r[c] += 1
|
32
|
+
else
|
33
|
+
r[c] = 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_rand_char
|
39
|
+
rsg = RandomStringGenerator.new
|
40
|
+
rsg.set_characters_array
|
41
|
+
assert_not_nil rsg.rand_char
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_rand_char_with_delete
|
45
|
+
rsg = RandomStringGenerator.new(2, :special => 'abd')
|
46
|
+
rsg.set_characters_array
|
47
|
+
3.times do
|
48
|
+
assert_not_nil rsg.rand_char( true )
|
49
|
+
end
|
50
|
+
|
51
|
+
rsg = RandomStringGenerator.new(2, :special => 'abd')
|
52
|
+
rsg.set_characters_array
|
53
|
+
3.times do
|
54
|
+
assert_nothing_raised { rsg.rand_char( true ) }
|
55
|
+
end
|
56
|
+
assert_raise RuntimeError do
|
57
|
+
rsg.rand_char( true )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_noduplicates_safety
|
62
|
+
rsg = RandomStringGenerator.new(3, :special => 'ab', :no_duplicates => true)
|
63
|
+
assert_raise RuntimeError do
|
64
|
+
rsg.generate
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_generation
|
69
|
+
rsg = RandomStringGenerator.new
|
70
|
+
assert_not_nil rsg.generate
|
71
|
+
|
72
|
+
rsg.set_option :single_quotes => true, :double_quotes => true, :backtick => true
|
73
|
+
|
74
|
+
assert_not_nil rsg.generate
|
75
|
+
assert_equal rsg.generate.length, 8
|
76
|
+
|
77
|
+
rsg = RandomStringGenerator.new(9, :all => true)
|
78
|
+
|
79
|
+
assert_not_nil rsg.generate
|
80
|
+
assert_equal rsg.generate.length, 9
|
81
|
+
|
82
|
+
rsg = RandomStringGenerator.new(10, :all_except_quotes => true)
|
83
|
+
|
84
|
+
assert_not_nil rsg.generate
|
85
|
+
assert_equal rsg.generate.length, 10
|
86
|
+
|
87
|
+
rsg.set_option :special => 5
|
88
|
+
assert_raise(ArgumentError) { rsg.set_characters_array }
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_bad_range
|
92
|
+
rsg = RandomStringGenerator.new
|
93
|
+
assert_raise(ArgumentError) { rsg.range('foo') }
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_wep_generation
|
97
|
+
ascii64_wep = RandomStringGenerator.generate_wep(64,:ascii)
|
98
|
+
ascii128_wep = RandomStringGenerator.generate_wep(128,:ascii)
|
99
|
+
hex152_wep = RandomStringGenerator.generate_wep(152)
|
100
|
+
hex256_wep = RandomStringGenerator.generate_wep(256)
|
101
|
+
|
102
|
+
assert_not_nil ascii64_wep
|
103
|
+
assert_not_nil ascii128_wep
|
104
|
+
assert_not_nil hex152_wep
|
105
|
+
assert_not_nil hex256_wep
|
106
|
+
|
107
|
+
assert_equal ascii64_wep.length, 5
|
108
|
+
assert_equal ascii128_wep.length, 13
|
109
|
+
assert_equal hex152_wep.length, 32
|
110
|
+
assert_equal hex256_wep.length, 58
|
111
|
+
|
112
|
+
assert_raise(RuntimeError) { RandomStringGenerator.generate_wep(152, :not_a_type) }
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_attrs
|
116
|
+
rsg = RandomStringGenerator.new
|
117
|
+
|
118
|
+
assert_equal rsg.length, 8
|
119
|
+
rsg.length = 7
|
120
|
+
assert_equal rsg.length, 7
|
121
|
+
|
122
|
+
assert_equal rsg.options, {:lower_alphas => true,
|
123
|
+
:upper_alphas => true,
|
124
|
+
:numerals => true,
|
125
|
+
:no_duplicates=> false }
|
126
|
+
rsg.set_option :symbols => false, :no_duplicates=> true
|
127
|
+
assert_equal rsg.options, {:lower_alphas => true,
|
128
|
+
:upper_alphas => true,
|
129
|
+
:numerals => true,
|
130
|
+
:no_duplicates=> true,
|
131
|
+
:symbols => false }
|
132
|
+
end
|
133
|
+
end
|
data/test/tc_salt.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Copyright (c) 2007 Operis Systems, LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
require 'test/unit'
|
15
|
+
require 'base64'
|
16
|
+
require File.join( File.dirname(__FILE__), '..', 'lib', 'pog.rb' )
|
17
|
+
|
18
|
+
TEST_PASS = '/O0op;G75wu3saMv|N9&DA?I*/!3-gqHUe9{VZL{M3YVoYUQ]6q{]Poz%c)V#T,i=g.G8>&'
|
19
|
+
TEST_SALT = 'foobar'
|
20
|
+
|
21
|
+
class TC_Salt < Test::Unit::TestCase
|
22
|
+
|
23
|
+
def test_new
|
24
|
+
salt = Salt.new( TEST_SALT )
|
25
|
+
assert_equal :end, salt.placement
|
26
|
+
|
27
|
+
salt = Salt.new( TEST_SALT, :beginning )
|
28
|
+
assert_equal :beginning, salt.placement
|
29
|
+
|
30
|
+
salt = Salt.new( :new, :end, :length => 8 )
|
31
|
+
assert_not_nil salt.string
|
32
|
+
assert_equal 8, salt.string.length
|
33
|
+
assert_equal :end, salt.placement
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_generate_str
|
37
|
+
for len in -32..32
|
38
|
+
salt = Salt.generate_str( len )
|
39
|
+
assert salt.length == (len >= 0 ? len : 0), "test_generate_salt failed for length #{len}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_salt_password
|
44
|
+
salt = Salt.new( TEST_SALT, :beginning )
|
45
|
+
assert_equal TEST_SALT + TEST_PASS,
|
46
|
+
salt.salt_password( TEST_PASS ),
|
47
|
+
"test_salt_password failed for beginning"
|
48
|
+
|
49
|
+
salt = Salt.new( TEST_SALT, :end )
|
50
|
+
assert_equal TEST_PASS + TEST_SALT,
|
51
|
+
salt.salt_password( TEST_PASS ),
|
52
|
+
"test_salt_password failed for end"
|
53
|
+
|
54
|
+
salt = Salt.new( "foobar", :split )
|
55
|
+
assert_equal 'foo' + TEST_PASS + 'bar',
|
56
|
+
salt.salt_password( TEST_PASS ),
|
57
|
+
"test_salt_password failed for even split"
|
58
|
+
|
59
|
+
salt = Salt.new( 'fooba', :split )
|
60
|
+
assert_equal 'fo' + TEST_PASS + 'oba',
|
61
|
+
salt.salt_password( TEST_PASS ),
|
62
|
+
"test_salt_password failed for odd split"
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_setters
|
67
|
+
salt = Salt.new
|
68
|
+
salt.string = TEST_SALT
|
69
|
+
assert_equal salt.string, TEST_SALT
|
70
|
+
|
71
|
+
salt.placement = 'foo'
|
72
|
+
assert_equal salt.placement, :foo
|
73
|
+
|
74
|
+
assert_raise RuntimeError do
|
75
|
+
salt.salt_password 'foo'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pog19
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 1.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Operis Systems, LLC
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-06 00:00:00 -08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: A Ruby gem for simplifying random password generation, password strength testing, password hashing and salting, and password-hash authentication.
|
22
|
+
email: ""
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- CHANGELOG
|
31
|
+
- lib/character_ranges.rb
|
32
|
+
- lib/encoding_translation.rb
|
33
|
+
- lib/password.rb
|
34
|
+
- lib/password_tests.rb
|
35
|
+
- lib/pog.rb
|
36
|
+
- lib/random_string_generator.rb
|
37
|
+
- lib/salt.rb
|
38
|
+
- lib/string.rb
|
39
|
+
- LICENSE
|
40
|
+
- NOTICE
|
41
|
+
- pog1-9.gemspec
|
42
|
+
- Rakefile
|
43
|
+
- README
|
44
|
+
- SECURITY
|
45
|
+
- test/tc_password.rb
|
46
|
+
- test/tc_password_tests.rb
|
47
|
+
- test/tc_random_string_generator.rb
|
48
|
+
- test/tc_salt.rb
|
49
|
+
- VERSION
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://pog.rubyforge.org/
|
52
|
+
licenses: []
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options:
|
56
|
+
- --all
|
57
|
+
- --inline-source
|
58
|
+
- --main
|
59
|
+
- lib/*.rb
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
requirements: []
|
77
|
+
|
78
|
+
rubyforge_project: pog
|
79
|
+
rubygems_version: 1.3.6
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: A Ruby gem for simplifying random password generation
|
83
|
+
test_files: []
|
84
|
+
|