dev-random-passwords 0.0.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.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE +28 -0
- data/README.md +52 -0
- data/Rakefile +2 -0
- data/dev-random-passwords.gemspec +23 -0
- data/lib/.DS_Store +0 -0
- data/lib/dev-random-passwords.rb +147 -0
- data/lib/dev-random-passwords/version.rb +3 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d3d62e89fa2d720f4775a0b3d73aed3e52c0b41e
|
4
|
+
data.tar.gz: 0dd5b95dbbde4d59663f9df222fbdd65a3921436
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 311fa111d01e0ace33d78c3759ae2c61c9795d65d64b50b161f571d4f71ab9bca01eb55d3a9ad5ce6333359bc314fdb6b63d3b083bb505131af566d52dc54ed5
|
7
|
+
data.tar.gz: 38db336e907278907ee927e8f95b3e9fb696305dc400b2f9538d44f99af4361703383de2aea27a9a0b8aba1e33c1df689d4c61cf93a28a0187451cec404ca6f6
|
data/.DS_Store
ADDED
Binary file
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Copyright (c) 2014, Joel Smith
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of Trosic nor the names of its
|
15
|
+
contributors may be used to endorse or promote products derived from
|
16
|
+
this software without specific prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Dev-Random-Passwords
|
2
|
+
|
3
|
+
Passwords that need to be used long term and are randomly generated need more randomness than your standard random library. On Linux, Unix or OSX /dev/random can be used to create really secure passwords from random bytes. This gem provides an implementation to do just that.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'dev-random-passwords'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install dev-random-passwords
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
Require the gem
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
require 'dev-random-passwords'
|
26
|
+
```
|
27
|
+
|
28
|
+
Set up a new instance
|
29
|
+
```ruby
|
30
|
+
rpg = DevRandomPasswords::Generator.new
|
31
|
+
```
|
32
|
+
|
33
|
+
Set some options for your password
|
34
|
+
```ruby
|
35
|
+
rpg.set_options({'lowercase' => true, 'uppercase' => true, 'digits' => true, 'length' => 12, 'requirements' => {'digits' => true, 'uppercase' => true, 'lowercase' => true}})
|
36
|
+
```
|
37
|
+
|
38
|
+
Generate a new password
|
39
|
+
```ruby
|
40
|
+
rpg.generate
|
41
|
+
=> "J0jhBM9dAPwk"
|
42
|
+
```
|
43
|
+
|
44
|
+
Enjoy!
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
1. Fork it ( https://github.com/jbsmith86/dev-random-passwords/fork )
|
49
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
50
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
51
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
52
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dev-random-passwords/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "dev-random-passwords"
|
8
|
+
spec.version = DevRandomPasswords::VERSION
|
9
|
+
spec.authors = ["Joel Smith"]
|
10
|
+
spec.email = ["joel@trosic.com"]
|
11
|
+
spec.summary = %q{Passwords that need to be used long term and are randomly generated need more randomness than your standard random library}
|
12
|
+
spec.description = %q{On Linux, Unix or OSX /dev/random can be used to create really secure passwords from random bytes. This gem provides an implementation to do just that.}
|
13
|
+
spec.homepage = "https://github.com/jbsmith86/dev-random-passwords"
|
14
|
+
spec.license = "BSD-3-Clause-Clear"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
end
|
data/lib/.DS_Store
ADDED
Binary file
|
@@ -0,0 +1,147 @@
|
|
1
|
+
module DevRandomPasswords
|
2
|
+
class Generator
|
3
|
+
|
4
|
+
attr_accessor :charset
|
5
|
+
attr_accessor :char_length
|
6
|
+
|
7
|
+
LOWERCASE_CHARS = ('a'..'z').to_a.join("")
|
8
|
+
UPPERCASE_CHARS = ('A'..'Z').to_a.join("")
|
9
|
+
DIGITS = ('0'..'9').to_a.join("")
|
10
|
+
SPECIAL_CHARS = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@charset = LOWERCASE_CHARS + UPPERCASE_CHARS + DIGITS + SPECIAL_CHARS
|
14
|
+
@char_length = 8
|
15
|
+
@requirements = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_byte
|
19
|
+
dev_random = File.new("/dev/random", 'r')
|
20
|
+
dev_random.read(1).ord
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_options(options={
|
24
|
+
'lowercase' => true,
|
25
|
+
'uppercase' => true,
|
26
|
+
'digits' => true,
|
27
|
+
'special' => true,
|
28
|
+
'include' => nil,
|
29
|
+
'exclude' => nil,
|
30
|
+
'length' => 8,
|
31
|
+
'requirements' => nil})
|
32
|
+
|
33
|
+
new_set = ""
|
34
|
+
|
35
|
+
if options['lowercase']
|
36
|
+
new_set += LOWERCASE_CHARS
|
37
|
+
end
|
38
|
+
|
39
|
+
if options['uppercase']
|
40
|
+
new_set += UPPERCASE_CHARS
|
41
|
+
end
|
42
|
+
|
43
|
+
if options['digits']
|
44
|
+
new_set += DIGITS
|
45
|
+
end
|
46
|
+
|
47
|
+
if options['special']
|
48
|
+
new_set += SPECIAL_CHARS
|
49
|
+
end
|
50
|
+
|
51
|
+
if options['include']
|
52
|
+
if options['include'].respond_to? :each
|
53
|
+
options['include'].each do |char|
|
54
|
+
unless new_set.includes? char
|
55
|
+
new_set += char
|
56
|
+
end
|
57
|
+
end
|
58
|
+
elsif options['include'].respond_to? :split
|
59
|
+
options['include'].split("").each do |char|
|
60
|
+
unless new_set.includes? char
|
61
|
+
new_set += char
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
if options['exclude']
|
68
|
+
if options['exclude'].respond_to? :each
|
69
|
+
options['exclude'].each do |char|
|
70
|
+
if new_set.includes? char
|
71
|
+
new_set -= char
|
72
|
+
end
|
73
|
+
end
|
74
|
+
elsif options['exclude'].respond_to? :split
|
75
|
+
options['exclude'].split("").each do |char|
|
76
|
+
if new_set.includes? char
|
77
|
+
new_set -= char
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@charset = new_set
|
84
|
+
|
85
|
+
if options['length']
|
86
|
+
if options['length'].respond_to? :to_i
|
87
|
+
@char_length = options['length'].to_i
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if options['requirements']
|
92
|
+
@requirements = options['requirements']
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
def requirements_met?(password)
|
98
|
+
|
99
|
+
if @requirements['uppercase']
|
100
|
+
if (password.split("") & UPPERCASE_CHARS.split("")).empty?
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if @requirements['lowercase']
|
106
|
+
if (password.split("") & LOWERCASE_CHARS.split("")).empty?
|
107
|
+
return false
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
if @requirements['digits']
|
112
|
+
if (password.split("") & DIGITS.split("")).empty?
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if @requirements['special']
|
118
|
+
if (password.split("") & SPECIAL_CHARS.split("")).empty?
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
return true
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
def generate
|
128
|
+
new_password = ""
|
129
|
+
|
130
|
+
@char_length.times do
|
131
|
+
rand_num = get_byte
|
132
|
+
while rand_num >= @charset.length
|
133
|
+
rand_num -= @charset.length
|
134
|
+
end
|
135
|
+
new_password += @charset[rand_num]
|
136
|
+
end
|
137
|
+
|
138
|
+
if requirements_met? new_password
|
139
|
+
return new_password
|
140
|
+
else
|
141
|
+
return generate
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dev-random-passwords
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joel Smith
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: On Linux, Unix or OSX /dev/random can be used to create really secure
|
42
|
+
passwords from random bytes. This gem provides an implementation to do just that.
|
43
|
+
email:
|
44
|
+
- joel@trosic.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".DS_Store"
|
50
|
+
- ".gitignore"
|
51
|
+
- Gemfile
|
52
|
+
- LICENSE
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- dev-random-passwords.gemspec
|
56
|
+
- lib/.DS_Store
|
57
|
+
- lib/dev-random-passwords.rb
|
58
|
+
- lib/dev-random-passwords/version.rb
|
59
|
+
homepage: https://github.com/jbsmith86/dev-random-passwords
|
60
|
+
licenses:
|
61
|
+
- BSD-3-Clause-Clear
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.2.2
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Passwords that need to be used long term and are randomly generated need
|
83
|
+
more randomness than your standard random library
|
84
|
+
test_files: []
|