xkpassword 0.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +46 -1
- data/bin/xkpassword +0 -48
- data/exe/xkpassword +48 -0
- data/lib/xkpassword.rb +14 -0
- data/lib/xkpassword/generator.rb +23 -8
- data/lib/xkpassword/version.rb +1 -1
- data/lib/xkpassword/words.rb +30 -0
- data/xkpassword.gemspec +9 -3
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f84da1ad0dfef6ea960bb3e03d167ede3b3a45b1
|
4
|
+
data.tar.gz: 838f02e3b6a4bb534c91bfe5fddee5168bf05d2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2fd8e2109dedce564cc2f5d254b4f9ac55da1b2aa2a385f6a2bfd1e2e349b5e75c191aab48e1f7bfb4da121c304087770d001eb68caf5f5832d30208f385ad25
|
7
|
+
data.tar.gz: 8976003191ea7e0caa2170bb334e535c91568c275b3d3cfa338d7be1353c52c0229194a2ebefb1bb8dc358c16be640f504ad9dcf40a2a0b897a73dec67ca0fc5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -22,7 +22,52 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
You can use this app stand-alone in the command line or include it in any of your Ruby
|
26
|
+
applications.
|
27
|
+
|
28
|
+
### Comamnd Line
|
29
|
+
The commandline application accepts the same collection of configuration options as would
|
30
|
+
the `XKPassword` module would. For more information use `xkpassword --help` to obtain a
|
31
|
+
full list of options.
|
32
|
+
|
33
|
+
```bash
|
34
|
+
~# xkpassword
|
35
|
+
~# xkpassword --help
|
36
|
+
```
|
37
|
+
|
38
|
+
### Ruby Apps
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
require 'xkpassword/generator'
|
42
|
+
|
43
|
+
options = {
|
44
|
+
max_length: 8,
|
45
|
+
min_length: 4,
|
46
|
+
separator: '-',
|
47
|
+
words: 4,
|
48
|
+
}
|
49
|
+
|
50
|
+
XKPassword.generate(options)
|
51
|
+
```
|
52
|
+
|
53
|
+
If you are generating multiple passwords at once, I recommend you use
|
54
|
+
the following as then it will only load and parse the databse once.
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
require 'xkpassword/generator'
|
58
|
+
|
59
|
+
options = {
|
60
|
+
max_length: 8,
|
61
|
+
min_length: 4,
|
62
|
+
separator: '-',
|
63
|
+
words: 4,
|
64
|
+
}
|
65
|
+
|
66
|
+
generator = XKPassword::Generator.new
|
67
|
+
generator.generate(options)
|
68
|
+
|
69
|
+
# 10.times { generator.generate(options) }
|
70
|
+
```
|
26
71
|
|
27
72
|
## Development
|
28
73
|
|
data/bin/xkpassword
CHANGED
@@ -1,48 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'optparse'
|
4
|
-
require 'artii'
|
5
|
-
|
6
|
-
require 'bundler/setup'
|
7
|
-
require 'xkpassword'
|
8
|
-
|
9
|
-
artii = Artii::Base.new font: 'standard'
|
10
|
-
message = """
|
11
|
-
#{ artii.asciify('XKPassword') }
|
12
|
-
by Ziyan Junaideen
|
13
|
-
|
14
|
-
How many times have you changed your password just because you forgot it?
|
15
|
-
Well, you are not alone. In todays security requirements, passwords need
|
16
|
-
to be secure and difficult to break. Passwords need to be secure, sure,
|
17
|
-
but they can also be easy to remember. Follow up this XKCD article for more
|
18
|
-
information - http://xkcd.com/936/
|
19
|
-
|
20
|
-
This does exactly what the picture predicts. You can use this in your Ruby
|
21
|
-
applications (Ex: Rails, Sinatra) or standalone if you install the gem (as
|
22
|
-
you have done here).
|
23
|
-
|
24
|
-
Wish you all the best keeping things secure.
|
25
|
-
|
26
|
-
Ziyan Junaideen
|
27
|
-
ziyan@jdeen.com
|
28
|
-
|
29
|
-
"""
|
30
|
-
|
31
|
-
options = {}
|
32
|
-
OptionParser.new do |opts|
|
33
|
-
opts.banner = "Usage: ./bin/xkpassword [options]"
|
34
|
-
|
35
|
-
opts.on('-v', '--version', 'Gem version') { options[:version] = true }
|
36
|
-
opts.on('-i', '--info', 'Gem info') { options[:info] = true }
|
37
|
-
|
38
|
-
opts.on('--words [INTEGER]', 'Number of wrods to be used in the generated password') { |words| options[:words] = words.to_i }
|
39
|
-
opts.on('--min-length [INTEGER]', 'Minimum length of a word') { |min| options[:min_length] = min.to_i }
|
40
|
-
opts.on('--max-length [INTEGER]', 'Maximum length of a word') { |max| options[:max_length] = max.to_i }
|
41
|
-
opts.on('--separator [STRING]', 'The separator to separate password') { |separator| options[:separator] = separator }
|
42
|
-
end.parse!
|
43
|
-
|
44
|
-
puts message if options[:info]
|
45
|
-
puts XKPassword::VERSION if options[:version]
|
46
|
-
puts XKPassword.generate(options) if !options[:info] && !options[:version]
|
47
|
-
|
48
|
-
|
data/exe/xkpassword
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'artii'
|
5
|
+
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'xkpassword'
|
8
|
+
|
9
|
+
artii = Artii::Base.new font: 'standard'
|
10
|
+
message = """
|
11
|
+
#{ artii.asciify('XKPassword') }
|
12
|
+
by Ziyan Junaideen
|
13
|
+
|
14
|
+
How many times have you changed your password just because you forgot it?
|
15
|
+
Well, you are not alone. In todays security requirements, passwords need
|
16
|
+
to be secure and difficult to break. Passwords need to be secure, sure,
|
17
|
+
but they can also be easy to remember. Follow up this XKCD article for more
|
18
|
+
information - http://xkcd.com/936/
|
19
|
+
|
20
|
+
This does exactly what the picture predicts. You can use this in your Ruby
|
21
|
+
applications (Ex: Rails, Sinatra) or standalone if you install the gem (as
|
22
|
+
you have done here).
|
23
|
+
|
24
|
+
Wish you all the best keeping things secure.
|
25
|
+
|
26
|
+
Ziyan Junaideen
|
27
|
+
ziyan@jdeen.com
|
28
|
+
|
29
|
+
"""
|
30
|
+
|
31
|
+
options = {}
|
32
|
+
OptionParser.new do |opts|
|
33
|
+
opts.banner = "Usage: ./exe/xkpassword [options]"
|
34
|
+
|
35
|
+
opts.on('-v', '--version', 'Gem version') { options[:version] = true }
|
36
|
+
opts.on('-i', '--info', 'Gem info') { options[:info] = true }
|
37
|
+
|
38
|
+
opts.on('--words [INTEGER]', 'Number of wrods to be used in the generated password') { |words| options[:words] = words.to_i }
|
39
|
+
opts.on('--min-length [INTEGER]', 'Minimum length of a word') { |min| options[:min_length] = min.to_i }
|
40
|
+
opts.on('--max-length [INTEGER]', 'Maximum length of a word') { |max| options[:max_length] = max.to_i }
|
41
|
+
opts.on('--separator [STRING]', 'The separator to separate password') { |separator| options[:separator] = separator }
|
42
|
+
end.parse!
|
43
|
+
|
44
|
+
puts message if options[:info]
|
45
|
+
puts XKPassword::VERSION if options[:version]
|
46
|
+
puts XKPassword.generate(options) if !options[:info] && !options[:version]
|
47
|
+
|
48
|
+
|
data/lib/xkpassword.rb
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
module XKPassword
|
2
|
+
|
3
|
+
# Generates a random password by intializing a `XKPassword::Generator` instance.
|
4
|
+
# This accepts argumennts identcal to the above class.
|
5
|
+
#
|
6
|
+
# If you are to generate multiple passwords (batch process lets say), you might as well directly
|
7
|
+
# use the `XKPassword::Generator` class as it will be faster since it will only need to load
|
8
|
+
# the dictionary once.
|
9
|
+
#
|
10
|
+
# @param [Hash] options The options to populate a generator
|
11
|
+
# @option options [Integer] :words The number of words to include in the generated password
|
12
|
+
# @option options [String] :separator The separator symbol to use joining words used in password
|
13
|
+
# @option options [Integer] :min_length The minimum length of a word to be used in the process
|
14
|
+
# @option options [Integer] :max_length The maximum length of a word to be used in the process
|
2
15
|
def self.generate(options = nil)
|
3
16
|
generator = XKPassword::Generator.new
|
4
17
|
generator.generate(options)
|
5
18
|
end
|
19
|
+
|
6
20
|
end
|
7
21
|
|
8
22
|
require 'xkpassword/version'
|
data/lib/xkpassword/generator.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
require 'xkpassword/words'
|
2
2
|
|
3
|
+
# The Generator class which finds words based on the requirement and using the provided options to build a
|
4
|
+
# new random passowrd.
|
5
|
+
#
|
6
|
+
# @attr_reader [XKPassword::Words] words A word database that gen provide you words for the length required
|
3
7
|
class XKPassword::Generator
|
4
8
|
DEFAULTS = {
|
5
9
|
max_length: 8,
|
@@ -14,15 +18,26 @@ class XKPassword::Generator
|
|
14
18
|
@words = XKPassword::Words.new
|
15
19
|
end
|
16
20
|
|
17
|
-
#
|
18
|
-
# separator: ' ',
|
19
|
-
# words: 4,
|
20
|
-
# min_length: 4,
|
21
|
-
# max_length: 8
|
22
|
-
# }
|
21
|
+
# Generates a password absed on the configuration provided.
|
23
22
|
#
|
24
|
-
#
|
25
|
-
#
|
23
|
+
# @param [Hash] options The options to populate a generator
|
24
|
+
# @option options [Integer] :words The number of words to include in the generated password
|
25
|
+
# @option options [String] :separator The separator symbol to use joining words used in password
|
26
|
+
# @option options [Integer] :min_length The minimum length of a word to be used in the process
|
27
|
+
# @option options [Integer] :max_length The maximum length of a word to be used in the process
|
28
|
+
#
|
29
|
+
# @return [String] The generated password
|
30
|
+
#
|
31
|
+
# @example Populating the method with all options (current default)
|
32
|
+
# options = {
|
33
|
+
# separator: ' ',
|
34
|
+
# words: 4,
|
35
|
+
# min_length: 4,
|
36
|
+
# max_length: 8
|
37
|
+
# }
|
38
|
+
#
|
39
|
+
# generator = XKPassword::Generator.new
|
40
|
+
# generator.generate(options)
|
26
41
|
def generate(options = nil)
|
27
42
|
options ||= {}
|
28
43
|
options = DEFAULTS.merge(options)
|
data/lib/xkpassword/version.rb
CHANGED
data/lib/xkpassword/words.rb
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require 'xkpassword/store'
|
2
2
|
|
3
|
+
# XKPassword::Words basically is a mini database of words. Its job is to provide words
|
4
|
+
# that mach a certain criteria. At the moment this criteria is limited to the length
|
5
|
+
# of the word.
|
6
|
+
#
|
7
|
+
# This uses `XKPassword::Store` which is basically the internal store for words. It is
|
8
|
+
# expected in the future to make this store configurable and use an external source.
|
9
|
+
#
|
10
|
+
# @attr_reader [Hash] words A collection of words store in a hash with the
|
11
|
+
# corresponding key to a word be a function of the
|
12
|
+
# lenght of the word.
|
3
13
|
class XKPassword::Words
|
4
14
|
attr_reader :words
|
5
15
|
|
@@ -8,24 +18,44 @@ class XKPassword::Words
|
|
8
18
|
setup
|
9
19
|
end
|
10
20
|
|
21
|
+
# Provide an array of words having the specified number of characters in it
|
22
|
+
#
|
23
|
+
# @param length [String] The number of characters of words should contain
|
24
|
+
#
|
25
|
+
# @return [Array<String>] Words from the source that match the length requirement.
|
11
26
|
def with_length(length)
|
12
27
|
fail ArgumentError 'Length should be a numeric' unless length.is_a? Numeric
|
13
28
|
words[key(length)]
|
14
29
|
end
|
15
30
|
|
31
|
+
|
32
|
+
# Provides a random word with the specified length
|
33
|
+
#
|
34
|
+
# @param length [Integer] The number of characters the word should contain
|
35
|
+
#
|
36
|
+
# @return [String] A random word with length
|
16
37
|
def random(length)
|
17
38
|
fail ArgumentError, 'Length should be numeric' unless length.is_a? Numeric
|
18
39
|
with_length(length).sample
|
19
40
|
end
|
20
41
|
|
42
|
+
# Provide lengths available in the databse
|
43
|
+
#
|
44
|
+
# @return [Array<Integer>] A collection of lengths of words available
|
21
45
|
def lengths
|
22
46
|
words.keys.map{ |key| gsub(/l/, '').to_i }
|
23
47
|
end
|
24
48
|
|
49
|
+
# The lenght of the shortest word
|
50
|
+
#
|
51
|
+
# @return [Integer] The length of the shortest word
|
25
52
|
def min_length
|
26
53
|
lengths.min
|
27
54
|
end
|
28
55
|
|
56
|
+
# The length of the longest word
|
57
|
+
#
|
58
|
+
# @return [Integer] The length of the longest word
|
29
59
|
def max_length
|
30
60
|
lengths.max
|
31
61
|
end
|
data/xkpassword.gemspec
CHANGED
@@ -11,9 +11,15 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.summary = %q{Hard to crack - XKPassword Generator for Ruby}
|
13
13
|
spec.description = """
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
Passwords are hard to remember, specially when they are hard to crack. I'd spend countless hours
|
15
|
+
every eyar resetting passwords and eventually running out of options that I can remember. I found
|
16
|
+
an interesting concept among a comic XKCD, it is to generate passwords using words and thus easier
|
17
|
+
to remember. Here is XKPassword, a lib which you can install to our Ruby app or run indipendant
|
18
|
+
in the command line.
|
19
|
+
|
20
|
+
Wish you a safer future.
|
21
|
+
|
22
|
+
Ziyan
|
17
23
|
"""
|
18
24
|
spec.homepage = "https://github.com/jdeen/xkpassword"
|
19
25
|
spec.license = "MIT"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xkpassword
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ziyan Junaideen
|
@@ -66,13 +66,16 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.5'
|
69
|
-
description: "\n
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
description: "\n Passwords are hard to remember, specially when they are hard to
|
70
|
+
crack. I'd spend countless hours\n every eyar resetting passwords and eventually
|
71
|
+
running out of options that I can remember. I found\n an interesting concept among
|
72
|
+
a comic XKCD, it is to generate passwords using words and thus easier\n to remember.
|
73
|
+
Here is XKPassword, a lib which you can install to our Ruby app or run indipendant\n
|
74
|
+
\ in the command line.\n\n Wish you a safer future.\n\n Ziyan\n "
|
73
75
|
email:
|
74
76
|
- ziyan@jdeen.com
|
75
|
-
executables:
|
77
|
+
executables:
|
78
|
+
- xkpassword
|
76
79
|
extensions: []
|
77
80
|
extra_rdoc_files: []
|
78
81
|
files:
|
@@ -88,6 +91,7 @@ files:
|
|
88
91
|
- bin/console
|
89
92
|
- bin/setup
|
90
93
|
- bin/xkpassword
|
94
|
+
- exe/xkpassword
|
91
95
|
- lib/xkpassword.rb
|
92
96
|
- lib/xkpassword/data/google-10000-english.txt
|
93
97
|
- lib/xkpassword/generator.rb
|