pog19 1.1.1
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.
- 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 
     | 
    
         
            +
             
     |