xkpassword 0.2.1 → 0.2.3
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 +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
|