osp 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.gitignore +4 -1
- data/.gitlab-ci.yml +47 -0
- data/.travis.yml +5 -2
- data/Makefile +10 -2
- data/Makefile.common +10 -10
- data/README.md +3 -2
- data/bin/osp +12 -12
- data/lib/osp/database.rb +16 -10
- data/lib/osp/host.rb +9 -17
- data/lib/osp/osp.rb +12 -11
- data/lib/osp/version.rb +2 -3
- data/osp.gemspec +5 -3
- data/osp.sublime-project +2 -2
- metadata +35 -9
- data/tests/tc_host.rb +0 -120
- data/tests/tc_osp.rb +0 -136
- data/tests/ts_all.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4654dbc7d8acad6ea9ec6a2c0f49111b379e38f1
|
4
|
+
data.tar.gz: 16a9675d9a2118b38ec2e28cf889031a4dfb7136
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e6b89878f707725f3c191a646f6f5d2446562150b0ee7d3dae77df950caa66397cc0fa476571c9912f0c577baa2fb4a26a9a3450d0c77626615597ef19f6874
|
7
|
+
data.tar.gz: 7d926eda3f8d98cae260b0589223c217ccaa225f10b99052f6d71916c7187a75250db0f49117cd29f99fb87aea5a808a28037004ad2a13349eefd53d42583c70
|
data/.editorconfig
ADDED
data/.gitignore
CHANGED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
before_script:
|
2
|
+
- gem update --system
|
3
|
+
- gem install bundler -v '~>1.13'
|
4
|
+
- bundler --version
|
5
|
+
- make
|
6
|
+
|
7
|
+
stages:
|
8
|
+
- test
|
9
|
+
- release
|
10
|
+
|
11
|
+
test_21:
|
12
|
+
image: ruby:2.1
|
13
|
+
stage: test
|
14
|
+
environment: test
|
15
|
+
only:
|
16
|
+
- tags
|
17
|
+
script:
|
18
|
+
- make test
|
19
|
+
|
20
|
+
test_22:
|
21
|
+
image: ruby:2.2
|
22
|
+
stage: test
|
23
|
+
environment: test
|
24
|
+
only:
|
25
|
+
- tags
|
26
|
+
script:
|
27
|
+
- make test
|
28
|
+
|
29
|
+
test_23:
|
30
|
+
image: ruby:2.3
|
31
|
+
stage: test
|
32
|
+
environment: test
|
33
|
+
only:
|
34
|
+
- tags
|
35
|
+
script:
|
36
|
+
- make test
|
37
|
+
|
38
|
+
release_gem:
|
39
|
+
image: ruby:2.3
|
40
|
+
stage: release
|
41
|
+
environment: gem
|
42
|
+
only:
|
43
|
+
- tags
|
44
|
+
script:
|
45
|
+
- mkdir -p ~/.gem
|
46
|
+
- 'printf "%s\n:rubygems_api_key: %s" "---" "${RUBYGEMSORG_API_KEY}" > ~/.gem/credentials; chmod 0600 ~/.gem/credentials'
|
47
|
+
- make release
|
data/.travis.yml
CHANGED
@@ -2,10 +2,13 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 2.1
|
4
4
|
- 2.2
|
5
|
+
- 2.3
|
6
|
+
- 2.4.0
|
7
|
+
- ruby-head
|
5
8
|
sudo: required
|
6
9
|
before_install:
|
7
10
|
- gem update --system
|
8
|
-
- gem install bundler -v '~>1.
|
11
|
+
- gem install bundler -v '~>1.13'
|
9
12
|
- bundler --version
|
10
13
|
install:
|
11
14
|
- make
|
@@ -16,4 +19,4 @@ script:
|
|
16
19
|
- make test
|
17
20
|
- cd
|
18
21
|
- which -a osp
|
19
|
-
- osp --version
|
22
|
+
- osp --version
|
data/Makefile
CHANGED
@@ -6,8 +6,16 @@ include Makefile.common
|
|
6
6
|
# Email: example@example.com
|
7
7
|
# Password: password
|
8
8
|
dev:
|
9
|
-
RUBYOPT
|
9
|
+
RUBYOPT=--debug $(BUNDLER) exec ./bin/osp -d passwords.osp
|
10
10
|
|
11
11
|
.PHONY: test
|
12
12
|
test:
|
13
|
-
RUBYOPT=-w $(BUNDLER) exec ./
|
13
|
+
RUBYOPT=-w $(BUNDLER) exec ./test/suite_all.rb
|
14
|
+
|
15
|
+
.PHONY: cov
|
16
|
+
cov:
|
17
|
+
RUBYOPT=-w COVERAGE=1 $(BUNDLER) exec ./test/suite_all.rb -v
|
18
|
+
|
19
|
+
.PHONY: cov_local
|
20
|
+
cov_local:
|
21
|
+
RUBYOPT=-w SIMPLECOV_PHPUNIT_LOAD_PATH=../simplecov-phpunit COVERAGE=1 $(BUNDLER) exec ./test/suite_all.rb -v
|
data/Makefile.common
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
|
2
|
-
# Ruby Common Big
|
3
|
-
# 2016-04-09
|
2
|
+
# Ruby Common Big 2016-11-08
|
4
3
|
|
5
4
|
MV = mv -nv
|
6
|
-
RM = rm -
|
5
|
+
RM = rm -rfd
|
7
6
|
MKDIR = mkdir -p
|
8
7
|
CHMOD = chmod
|
9
|
-
BUNDLER =
|
8
|
+
BUNDLER = bundler
|
10
9
|
BUNDLER_OPTIONS = --jobs=5 --retry=3
|
11
10
|
GEMSPEC_FILE = $(GEM_NAME).gemspec
|
12
11
|
|
@@ -17,18 +16,21 @@ all: setup $(ALL_TARGETS_EXT)
|
|
17
16
|
setup: .setup
|
18
17
|
|
19
18
|
.setup:
|
19
|
+
which ruby &> /dev/null
|
20
|
+
which $(BUNDLER) &> /dev/null
|
21
|
+
ruby -v
|
20
22
|
$(BUNDLER) install $(BUNDLER_OPTIONS)
|
21
23
|
touch $@
|
22
24
|
|
23
25
|
.PHONY: install
|
24
26
|
install:
|
25
|
-
gem_file=$$(gem build $(GEMSPEC_FILE) | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
|
26
|
-
|
27
|
+
gem_file=$$(gem build $(GEMSPEC_FILE) 2> /dev/null | grep 'File:' | tail -1 | awk '{ print $$2 }'); \
|
28
|
+
gem install $$gem_file; \
|
27
29
|
$(RM) $$gem_file
|
28
30
|
|
29
31
|
.PHONY: uninstall
|
30
32
|
uninstall:
|
31
|
-
|
33
|
+
gem uninstall $(GEM_NAME)
|
32
34
|
|
33
35
|
.PHONY: update
|
34
36
|
update:
|
@@ -36,9 +38,7 @@ update:
|
|
36
38
|
|
37
39
|
.PHONY: clean
|
38
40
|
clean:
|
39
|
-
$(RM) .bundle
|
40
|
-
$(RM) .setup
|
41
|
-
$(RM) Gemfile.lock
|
41
|
+
$(RM) .bundle .setup Gemfile.lock
|
42
42
|
|
43
43
|
.PHONY: release
|
44
44
|
release: | releases
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ The preferred method of installation is via RubyGems.org:
|
|
9
9
|
|
10
10
|
or via `Gemfile`:
|
11
11
|
|
12
|
-
gem 'osp', '~>0.
|
12
|
+
gem 'osp', '~>0.5'
|
13
13
|
|
14
14
|
## Project Links
|
15
15
|
|
@@ -26,7 +26,8 @@ or via `Gemfile`:
|
|
26
26
|
- [Ruby AES Encryption using OpenSSL](https://gist.github.com/byu/99651)
|
27
27
|
|
28
28
|
## License
|
29
|
-
|
29
|
+
|
30
|
+
Copyright (C) 2015 Christian Mayer <https://fox21.at>
|
30
31
|
|
31
32
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
32
33
|
|
data/bin/osp
CHANGED
@@ -2,23 +2,23 @@
|
|
2
2
|
# coding: UTF-8
|
3
3
|
|
4
4
|
require 'optparse'
|
5
|
-
require '
|
5
|
+
require 'pathname'
|
6
6
|
require 'highline'
|
7
7
|
require 'msgpack'
|
8
8
|
require 'osp'
|
9
9
|
|
10
10
|
|
11
11
|
@options = {
|
12
|
-
:database_path =>
|
13
|
-
:database_lock_path =>
|
12
|
+
:database_path => Pathname.new('.osp').expand_path(Dir.home),
|
13
|
+
:database_lock_path => Pathname.new('.osp~lock').expand_path(Dir.home),
|
14
14
|
}
|
15
15
|
opts = OptionParser.new do |o|
|
16
16
|
o.banner = 'Usage: osp [options]'
|
17
17
|
o.separator('')
|
18
18
|
|
19
19
|
o.on('-d', '--database <path>', 'Path to the database file.') do |path|
|
20
|
-
@options[:database_path] = path
|
21
|
-
@options[:database_lock_path] = "#{
|
20
|
+
@options[:database_path] = Pathname.new(path).expand_path
|
21
|
+
@options[:database_lock_path] = Pathname.new("#{@options[:database_path]}~lock").expand_path
|
22
22
|
end
|
23
23
|
|
24
24
|
o.on_tail('-V', '--version', 'Show version.') do
|
@@ -33,7 +33,7 @@ opts = OptionParser.new do |o|
|
|
33
33
|
exit 3
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
opts.parse(ARGV)
|
37
37
|
|
38
38
|
|
39
39
|
if !STDIN.tty?
|
@@ -42,11 +42,11 @@ end
|
|
42
42
|
|
43
43
|
@cli = HighLine.new
|
44
44
|
|
45
|
-
puts "OSP - OneShallPass #{TheFox::OSP::VERSION}"
|
45
|
+
puts "OSP - OneShallPass v#{TheFox::OSP::VERSION}"
|
46
46
|
puts TheFox::OSP::HOMEPAGE
|
47
47
|
puts
|
48
48
|
|
49
|
-
if
|
49
|
+
if @options[:database_lock_path].exist?
|
50
50
|
puts "WARNING: lock file exist: '#{@options[:database_lock_path]}'"
|
51
51
|
overwrite = @cli.ask('Overwrite? '){ |q| q.default = 'n' }.downcase
|
52
52
|
if overwrite == 'n'
|
@@ -55,7 +55,7 @@ if File.exist?(@options[:database_lock_path])
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
File.write(@options[:database_lock_path], 'tmp')
|
58
|
-
|
58
|
+
@options[:database_lock_path].chmod(0600)
|
59
59
|
File.binwrite(@options[:database_lock_path], Process.pid)
|
60
60
|
|
61
61
|
puts 'Master Login'
|
@@ -91,8 +91,8 @@ def database_write_step(step, msg)
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def remove_lock
|
94
|
-
if
|
95
|
-
|
94
|
+
if @options[:database_lock_path].exist?
|
95
|
+
@options[:database_lock_path].unlink
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -136,7 +136,7 @@ def host_edit(host = nil)
|
|
136
136
|
puts 'New Host'
|
137
137
|
puts
|
138
138
|
|
139
|
-
tmp = @cli.ask(' Hostname: ' + (
|
139
|
+
tmp = @cli.ask(' Hostname: ' + (host.name.nil? ? '[]' : "[#{host.name}]") + ' ').strip.to_s
|
140
140
|
host.name = tmp if tmp != ''
|
141
141
|
host.name = nil if host.name == ''
|
142
142
|
if host.name.nil?
|
data/lib/osp/database.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
|
2
|
+
require 'pathname'
|
3
|
+
|
2
4
|
module TheFox
|
3
5
|
module OSP
|
4
6
|
|
@@ -19,7 +21,7 @@ module TheFox
|
|
19
21
|
'created_at' => DateTime.now.to_s,
|
20
22
|
'updated_at' => DateTime.now.to_s,
|
21
23
|
},
|
22
|
-
'hosts' =>
|
24
|
+
'hosts' => Hash.new,
|
23
25
|
}
|
24
26
|
end
|
25
27
|
|
@@ -28,13 +30,15 @@ module TheFox
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def load_callback(*o)
|
31
|
-
|
33
|
+
if !@load_callback_method.nil?
|
34
|
+
@load_callback_method.call(*o)
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
def load
|
35
39
|
load_callback(1000, 'Check for existing database file.')
|
36
40
|
|
37
|
-
if
|
41
|
+
if @file_path.exist?
|
38
42
|
load_callback(1050, "Use database file: #{@file_path}")
|
39
43
|
|
40
44
|
load_callback(1100, "Read file '#{@file_path}'.")
|
@@ -87,14 +91,16 @@ module TheFox
|
|
87
91
|
end
|
88
92
|
|
89
93
|
def write_callback(*o)
|
90
|
-
@write_callback_method.
|
94
|
+
unless @write_callback_method.nil?
|
95
|
+
@write_callback_method.call(*o)
|
96
|
+
end
|
91
97
|
end
|
92
98
|
|
93
99
|
def write
|
94
100
|
write_callback(1000, 'Check database for changes.')
|
95
101
|
|
96
102
|
if @has_changed
|
97
|
-
tmp = "#{@file_path}~"
|
103
|
+
tmp = Pathname.new("#{@file_path}~").expand_path
|
98
104
|
|
99
105
|
# http://stackoverflow.com/questions/9049789/aes-encryption-key-versus-iv
|
100
106
|
# http://keepass.info/help/base/security.html
|
@@ -130,21 +136,21 @@ module TheFox
|
|
130
136
|
|
131
137
|
write_callback(1300, "Write temp file to '#{tmp}'.")
|
132
138
|
File.write(tmp, 'tmp')
|
133
|
-
|
139
|
+
tmp.chmod(0600)
|
134
140
|
File.binwrite(tmp, db_out)
|
135
141
|
|
136
142
|
backup_dts = Time.now.strftime('%Y%m%d-%H%M%S')
|
137
|
-
backup = "#{@file_path}~backup_#{backup_dts}_"
|
143
|
+
backup = Pathname.new("#{@file_path}~backup_#{backup_dts}_" << Digest::SHA256.file(tmp.to_s).hexdigest[0..7])
|
138
144
|
|
139
145
|
write_callback(1350, "Backup temp file to '#{backup}'.")
|
140
146
|
File.write(backup, 'tmp')
|
141
|
-
|
147
|
+
backup.chmod(0600)
|
142
148
|
FileUtils.cp(tmp, backup)
|
143
149
|
|
144
150
|
write_callback(1390, "Finally, move temp file to '#{@file_path}'.")
|
145
151
|
File.write(@file_path, 'tmp')
|
146
|
-
|
147
|
-
|
152
|
+
@file_path.chmod(0600)
|
153
|
+
tmp.rename(@file_path)
|
148
154
|
|
149
155
|
@has_changed = false
|
150
156
|
else
|
data/lib/osp/host.rb
CHANGED
@@ -8,6 +8,10 @@ module TheFox
|
|
8
8
|
|
9
9
|
attr_accessor :created_at
|
10
10
|
attr_accessor :updated_at
|
11
|
+
attr_reader :osp
|
12
|
+
attr_reader :name
|
13
|
+
attr_reader :hashes
|
14
|
+
attr_writer :password
|
11
15
|
|
12
16
|
def initialize(osp = nil)
|
13
17
|
@osp = osp
|
@@ -20,20 +24,18 @@ module TheFox
|
|
20
24
|
@generation = 1
|
21
25
|
@length = 16
|
22
26
|
@symbols = 1
|
23
|
-
@hashes =
|
27
|
+
@hashes = @osp.nil? ? nil : @osp.hashes
|
24
28
|
@password = nil
|
25
29
|
end
|
26
30
|
|
27
31
|
def osp=(v)
|
28
|
-
|
32
|
+
if !v.is_a?(OSP)
|
33
|
+
raise ArgumentError, "Wrong type -- #{v.class}"
|
34
|
+
end
|
29
35
|
|
30
36
|
@osp = v
|
31
37
|
end
|
32
38
|
|
33
|
-
def osp
|
34
|
-
@osp
|
35
|
-
end
|
36
|
-
|
37
39
|
def version=(v)
|
38
40
|
@version = v.to_i
|
39
41
|
end
|
@@ -43,12 +45,7 @@ module TheFox
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def name=(v)
|
46
|
-
|
47
|
-
@name = v
|
48
|
-
end
|
49
|
-
|
50
|
-
def name
|
51
|
-
@name
|
48
|
+
@name = v == '' ? nil : v
|
52
49
|
end
|
53
50
|
|
54
51
|
def generation=(v)
|
@@ -79,10 +76,6 @@ module TheFox
|
|
79
76
|
@hashes = v
|
80
77
|
end
|
81
78
|
|
82
|
-
def hashes
|
83
|
-
@hashes
|
84
|
-
end
|
85
|
-
|
86
79
|
def generate_password(regenerate = false)
|
87
80
|
if @password.nil? && !@osp.nil? || regenerate
|
88
81
|
@password = @osp.password(@name, @length, @generation, @symbols)
|
@@ -126,4 +119,3 @@ module TheFox
|
|
126
119
|
end
|
127
120
|
end
|
128
121
|
end
|
129
|
-
|
data/lib/osp/osp.rb
CHANGED
@@ -4,7 +4,6 @@ require 'openssl'
|
|
4
4
|
require 'msgpack'
|
5
5
|
require 'thefox-ext'
|
6
6
|
|
7
|
-
|
8
7
|
module TheFox
|
9
8
|
module OSP
|
10
9
|
|
@@ -33,7 +32,9 @@ module TheFox
|
|
33
32
|
end
|
34
33
|
|
35
34
|
def password(host_name, length = 16, generation = 1, symbols = self.class::SYMBOLS)
|
36
|
-
|
35
|
+
if host_name.nil? || host_name == '' || !host_name
|
36
|
+
raise ArgumentError, "'host_name' can't be '' or nil"
|
37
|
+
end
|
37
38
|
|
38
39
|
key_derivation if @dk.nil?
|
39
40
|
|
@@ -46,7 +47,9 @@ module TheFox
|
|
46
47
|
hmac_b64 = Base64.strict_encode64(hmac_p)
|
47
48
|
pw = hmac_b64 if is_ok_pw(hmac_b64)
|
48
49
|
|
49
|
-
@password_callback_method.
|
50
|
+
unless @password_callback_method.nil?
|
51
|
+
@password_callback_method.call(step, hmac_b64)
|
52
|
+
end
|
50
53
|
step += 1
|
51
54
|
end
|
52
55
|
|
@@ -55,7 +58,7 @@ module TheFox
|
|
55
58
|
|
56
59
|
_b64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
|
57
60
|
|
58
|
-
indices =
|
61
|
+
indices = Array.new
|
59
62
|
(0..self.class::PASSWORD_MIN_SIZE).each do |n|
|
60
63
|
c = pw[n]
|
61
64
|
if c.method(sub_method).call
|
@@ -70,7 +73,7 @@ module TheFox
|
|
70
73
|
_map_len = _map.length
|
71
74
|
|
72
75
|
last = 0
|
73
|
-
arr =
|
76
|
+
arr = Array.new
|
74
77
|
indices.each do |index|
|
75
78
|
arr << pw[last...index]
|
76
79
|
c = pw[index]
|
@@ -117,7 +120,7 @@ module TheFox
|
|
117
120
|
end
|
118
121
|
|
119
122
|
(self.class::PASSWORD_MIN_SIZE...self.class::PASSWORD_MAX_SIZE).each do |n|
|
120
|
-
|
123
|
+
unless pw[n].is_valid?
|
121
124
|
return false
|
122
125
|
end
|
123
126
|
end
|
@@ -141,15 +144,13 @@ module TheFox
|
|
141
144
|
end
|
142
145
|
end
|
143
146
|
|
144
|
-
rv = ''
|
145
147
|
if lowers >= caps && lowers >= digits then
|
146
|
-
|
148
|
+
'is_lower?'
|
147
149
|
elsif digits > lowers && digits >= caps
|
148
|
-
|
150
|
+
'is_digit?'
|
149
151
|
else
|
150
|
-
|
152
|
+
'is_upper?'
|
151
153
|
end
|
152
|
-
rv
|
153
154
|
end
|
154
155
|
|
155
156
|
end
|
data/lib/osp/version.rb
CHANGED
data/osp.gemspec
CHANGED
@@ -24,9 +24,11 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.required_ruby_version = '>=2.1.0'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'minitest', '~>5.8'
|
27
|
+
spec.add_development_dependency 'simplecov', '~>0.12'
|
28
|
+
spec.add_development_dependency 'simplecov-phpunit', '~>1.0'
|
27
29
|
|
28
|
-
spec.
|
29
|
-
spec.
|
30
|
+
spec.add_runtime_dependency 'highline', '~>1.7'
|
31
|
+
spec.add_runtime_dependency 'msgpack', '~>1.0'
|
30
32
|
|
31
|
-
spec.
|
33
|
+
spec.add_runtime_dependency 'thefox-ext', '~>1.2'
|
32
34
|
end
|
data/osp.sublime-project
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Mayer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.12'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: simplecov-phpunit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: highline
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +72,14 @@ dependencies:
|
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
75
|
+
version: '1.0'
|
48
76
|
type: :runtime
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
82
|
+
version: '1.0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: thefox-ext
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,7 +101,9 @@ executables:
|
|
73
101
|
extensions: []
|
74
102
|
extra_rdoc_files: []
|
75
103
|
files:
|
104
|
+
- ".editorconfig"
|
76
105
|
- ".gitignore"
|
106
|
+
- ".gitlab-ci.yml"
|
77
107
|
- ".travis.yml"
|
78
108
|
- Gemfile
|
79
109
|
- Makefile
|
@@ -90,9 +120,6 @@ files:
|
|
90
120
|
- lib/osp/version.rb
|
91
121
|
- osp.gemspec
|
92
122
|
- osp.sublime-project
|
93
|
-
- tests/tc_host.rb
|
94
|
-
- tests/tc_osp.rb
|
95
|
-
- tests/ts_all.rb
|
96
123
|
homepage: https://github.com/TheFox/osp
|
97
124
|
licenses:
|
98
125
|
- GPL-3.0
|
@@ -113,9 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
140
|
version: '0'
|
114
141
|
requirements: []
|
115
142
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
143
|
+
rubygems_version: 2.6.8
|
117
144
|
signing_key:
|
118
145
|
specification_version: 4
|
119
146
|
summary: One Shall Pass
|
120
147
|
test_files: []
|
121
|
-
has_rdoc:
|
data/tests/tc_host.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'minitest/autorun'
|
4
|
-
require 'osp'
|
5
|
-
|
6
|
-
|
7
|
-
class TestHost < MiniTest::Test
|
8
|
-
def test_base
|
9
|
-
osp = TheFox::OSP::Host.new
|
10
|
-
|
11
|
-
assert_equal('TheFox::OSP::Host', osp.class.to_s)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_initialize
|
15
|
-
host = TheFox::OSP::Host.new
|
16
|
-
|
17
|
-
assert_equal(nil, host.osp)
|
18
|
-
assert_equal(1, host.version)
|
19
|
-
# assert_equal(, host.created_at)
|
20
|
-
# assert_equal(, host.updated_at)
|
21
|
-
assert_equal(nil, host.name)
|
22
|
-
assert_equal(1, host.generation)
|
23
|
-
assert_equal(16, host.length)
|
24
|
-
assert_equal(1, host.symbols)
|
25
|
-
assert_equal(nil, host.hashes)
|
26
|
-
assert_equal(nil, host.password)
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_version
|
30
|
-
host = TheFox::OSP::Host.new
|
31
|
-
|
32
|
-
host.version = 2
|
33
|
-
assert_equal(2, host.version)
|
34
|
-
|
35
|
-
host.version = '3'
|
36
|
-
assert_equal(3, host.version)
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_created_at
|
40
|
-
host = TheFox::OSP::Host.new
|
41
|
-
|
42
|
-
now = DateTime.now
|
43
|
-
host.created_at = now
|
44
|
-
assert_equal(now, host.created_at)
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_updated_at
|
48
|
-
host = TheFox::OSP::Host.new
|
49
|
-
|
50
|
-
now = DateTime.now
|
51
|
-
host.updated_at = now
|
52
|
-
assert_equal(now, host.updated_at)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_name
|
56
|
-
host = TheFox::OSP::Host.new
|
57
|
-
|
58
|
-
host.name = ''
|
59
|
-
assert_equal(nil, host.name)
|
60
|
-
|
61
|
-
host.name = 'host1'
|
62
|
-
assert_equal('host1', host.name)
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_generation
|
66
|
-
host = TheFox::OSP::Host.new
|
67
|
-
|
68
|
-
host.generation = 2
|
69
|
-
assert_equal(2, host.generation)
|
70
|
-
|
71
|
-
host.generation = '3'
|
72
|
-
assert_equal(3, host.generation)
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_length
|
76
|
-
host = TheFox::OSP::Host.new
|
77
|
-
|
78
|
-
host.length = 2
|
79
|
-
assert_equal(2, host.length)
|
80
|
-
|
81
|
-
host.length = '3'
|
82
|
-
assert_equal(3, host.length)
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_symbols
|
86
|
-
host = TheFox::OSP::Host.new
|
87
|
-
|
88
|
-
host.symbols = 2
|
89
|
-
assert_equal(2, host.symbols)
|
90
|
-
|
91
|
-
host.symbols = '3'
|
92
|
-
assert_equal(3, host.symbols)
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_hashes
|
96
|
-
host = TheFox::OSP::Host.new
|
97
|
-
|
98
|
-
host.hashes = nil
|
99
|
-
assert_equal(nil, host.hashes)
|
100
|
-
|
101
|
-
host.hashes = 2
|
102
|
-
assert_equal(2, host.hashes)
|
103
|
-
|
104
|
-
host.hashes = '3'
|
105
|
-
assert_equal('3', host.hashes)
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_password
|
109
|
-
host = TheFox::OSP::Host.new
|
110
|
-
|
111
|
-
host.password = nil
|
112
|
-
assert_equal(nil, host.password)
|
113
|
-
|
114
|
-
host.password = 2
|
115
|
-
assert_equal(2, host.password)
|
116
|
-
|
117
|
-
host.password = '3'
|
118
|
-
assert_equal('3', host.password)
|
119
|
-
end
|
120
|
-
end
|
data/tests/tc_osp.rb
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'minitest/autorun'
|
4
|
-
require 'osp'
|
5
|
-
|
6
|
-
|
7
|
-
class TestOsp < MiniTest::Test
|
8
|
-
def test_that_it_has_a_version_number
|
9
|
-
refute_nil ::TheFox::OSP::VERSION
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_base
|
13
|
-
osp = TheFox::OSP::OSP.new('example@example.com', 'test1', 2 ** 10)
|
14
|
-
|
15
|
-
assert_equal('TheFox::OSP::OSP', osp.class.to_s)
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_hashes
|
19
|
-
osp = TheFox::OSP::OSP.new('example@example.com', 'test1', 2 ** 10)
|
20
|
-
assert_equal(2 ** 10, osp.hashes)
|
21
|
-
|
22
|
-
osp = TheFox::OSP::OSP.new('example@example.com', 'test1', 2 ** 20)
|
23
|
-
assert_equal(2 ** 20, osp.hashes)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_password1
|
27
|
-
osp = TheFox::OSP::OSPDotCom.new('example@example.com', 'test1', 2 ** 10)
|
28
|
-
osp.key_derivation
|
29
|
-
|
30
|
-
assert_equal('TA24hNn0', osp.password('host1', 8, 1, 0))
|
31
|
-
assert_equal('TA>4hNn0', osp.password('host1', 8, 1, 1))
|
32
|
-
assert_equal('TA>?hNn0', osp.password('host1', 8, 1, 2))
|
33
|
-
assert_equal('TA>?hNn,', osp.password('host1', 8, 1, 3))
|
34
|
-
|
35
|
-
assert_equal('DHKzN7uY', osp.password('host2', 8, 1, 0))
|
36
|
-
assert_equal('@HKzN7uY', osp.password('host2', 8, 1, 1))
|
37
|
-
assert_equal('@^KzN7uY', osp.password('host2', 8, 1, 2))
|
38
|
-
assert_equal('@^(zN7uY', osp.password('host2', 8, 1, 3))
|
39
|
-
|
40
|
-
assert_equal('Qf4lvgE7', osp.password('host3', 8, 1, 0))
|
41
|
-
assert_equal('Q!4lvgE7', osp.password('host3', 8, 1, 1))
|
42
|
-
assert_equal('Q!4&vgE7', osp.password('host3', 8, 1, 2))
|
43
|
-
assert_equal('Q!4&[gE7', osp.password('host3', 8, 1, 3))
|
44
|
-
|
45
|
-
assert_equal('DHKzN7uYUBc3l0wi', osp.password('host2', 16, 1, 0))
|
46
|
-
assert_equal('@HKzN7uYUBc3l0wi', osp.password('host2', 16, 1, 1))
|
47
|
-
assert_equal('@^KzN7uYUBc3l0wi', osp.password('host2', 16, 1, 2))
|
48
|
-
assert_equal('@^(zN7uYUBc3l0wi', osp.password('host2', 16, 1, 3))
|
49
|
-
|
50
|
-
assert_equal('wU0t38KE4tDQb3c0', osp.password('host2', 16, 2, 0))
|
51
|
-
assert_equal('wU,t38KE4tDQb3c0', osp.password('host2', 16, 2, 1))
|
52
|
-
assert_equal('wU,t.8KE4tDQb3c0', osp.password('host2', 16, 2, 2))
|
53
|
-
assert_equal('wU,t.!KE4tDQb3c0', osp.password('host2', 16, 2, 3))
|
54
|
-
|
55
|
-
assert_equal('OezcZk881M3Jxw9Z', osp.password('host2', 16, 3, 0))
|
56
|
-
assert_equal('O~zcZk881M3Jxw9Z', osp.password('host2', 16, 3, 1))
|
57
|
-
assert_equal('O~:cZk881M3Jxw9Z', osp.password('host2', 16, 3, 2))
|
58
|
-
assert_equal('O~:/Zk881M3Jxw9Z', osp.password('host2', 16, 3, 3))
|
59
|
-
end
|
60
|
-
|
61
|
-
# def test_password2
|
62
|
-
# #PASSWORD_MIN_SIZE = 8
|
63
|
-
# #PASSWORD_MAX_SIZE = 16
|
64
|
-
|
65
|
-
# osp = TheFox::OSP::OSP.new('example@example.com', 'test1', 2 ** 10)
|
66
|
-
# osp.key_derivation
|
67
|
-
|
68
|
-
# assert_equal('cXyE2Dq1', osp.password('host1', 8, 1, 0))
|
69
|
-
# assert_equal('/XyE2Dq1', osp.password('host1', 8, 1, 1))
|
70
|
-
# assert_equal('/X;E2Dq1', osp.password('host1', 8, 1, 2))
|
71
|
-
# assert_equal('/X;E2D_1', osp.password('host1', 8, 1, 3))
|
72
|
-
|
73
|
-
# assert_equal('kT455AIH', osp.password('host2', 8, 1, 0))
|
74
|
-
# assert_equal('k]455AIH', osp.password('host2', 8, 1, 1))
|
75
|
-
# assert_equal('k]455`IH', osp.password('host2', 8, 1, 2))
|
76
|
-
# assert_equal('k]455`&H', osp.password('host2', 8, 1, 3))
|
77
|
-
|
78
|
-
# assert_equal('RN1vFCCx', osp.password('host3', 8, 1, 0))
|
79
|
-
# assert_equal('}N1vFCCx', osp.password('host3', 8, 1, 1))
|
80
|
-
# assert_equal('}_1vFCCx', osp.password('host3', 8, 1, 2))
|
81
|
-
# assert_equal('}_1v$CCx', osp.password('host3', 8, 1, 3))
|
82
|
-
|
83
|
-
# assert_equal('kT455AIHkWRmXRN9', osp.password('host2', 16, 1, 0))
|
84
|
-
# assert_equal('k]455AIHkWRmXRN9', osp.password('host2', 16, 1, 1))
|
85
|
-
# assert_equal('k]455`IHkWRmXRN9', osp.password('host2', 16, 1, 2))
|
86
|
-
# assert_equal('k]455`&HkWRmXRN9', osp.password('host2', 16, 1, 3))
|
87
|
-
|
88
|
-
# assert_equal('SDBNsS7tMF4HjpPz', osp.password('host2', 16, 2, 0))
|
89
|
-
# assert_equal('[DBNsS7tMF4HjpPz', osp.password('host2', 16, 2, 1))
|
90
|
-
# assert_equal('[@BNsS7tMF4HjpPz', osp.password('host2', 16, 2, 2))
|
91
|
-
# assert_equal('[@~NsS7tMF4HjpPz', osp.password('host2', 16, 2, 3))
|
92
|
-
|
93
|
-
# assert_equal('GZ8SAox0xBvFM9QL', osp.password('host2', 16, 3, 0))
|
94
|
-
# assert_equal('%Z8SAox0xBvFM9QL', osp.password('host2', 16, 3, 1))
|
95
|
-
# assert_equal('%>8SAox0xBvFM9QL', osp.password('host2', 16, 3, 2))
|
96
|
-
# assert_equal('%>8[Aox0xBvFM9QL', osp.password('host2', 16, 3, 3))
|
97
|
-
# end
|
98
|
-
|
99
|
-
def test_password3
|
100
|
-
#PASSWORD_MIN_SIZE = 8
|
101
|
-
#PASSWORD_MAX_SIZE = 32
|
102
|
-
|
103
|
-
osp = TheFox::OSP::OSP.new('example@example.com', 'test1', 2 ** 10)
|
104
|
-
osp.key_derivation
|
105
|
-
|
106
|
-
assert_equal('cXyE2Dq1', osp.password('host1', 8, 1, 0))
|
107
|
-
assert_equal('/XyE2Dq1', osp.password('host1', 8, 1, 1))
|
108
|
-
assert_equal('/X;E2Dq1', osp.password('host1', 8, 1, 2))
|
109
|
-
assert_equal('/X;E2D_1', osp.password('host1', 8, 1, 3))
|
110
|
-
|
111
|
-
assert_equal('ar7JQegF', osp.password('host2', 8, 1, 0))
|
112
|
-
assert_equal('.r7JQegF', osp.password('host2', 8, 1, 1))
|
113
|
-
assert_equal('.+7JQegF', osp.password('host2', 8, 1, 2))
|
114
|
-
assert_equal('.+7JQ~gF', osp.password('host2', 8, 1, 3))
|
115
|
-
|
116
|
-
assert_equal('RN1vFCCx', osp.password('host3', 8, 1, 0))
|
117
|
-
assert_equal('}N1vFCCx', osp.password('host3', 8, 1, 1))
|
118
|
-
assert_equal('}_1vFCCx', osp.password('host3', 8, 1, 2))
|
119
|
-
assert_equal('}_1v$CCx', osp.password('host3', 8, 1, 3))
|
120
|
-
|
121
|
-
assert_equal('ar7JQegFyBk737gQ', osp.password('host2', 16, 1, 0))
|
122
|
-
assert_equal('.r7JQegFyBk737gQ', osp.password('host2', 16, 1, 1))
|
123
|
-
assert_equal('.+7JQegFyBk737gQ', osp.password('host2', 16, 1, 2))
|
124
|
-
assert_equal('.+7JQ~gFyBk737gQ', osp.password('host2', 16, 1, 3))
|
125
|
-
|
126
|
-
assert_equal('E3uJvG0rGFKwgpHD', osp.password('host2', 16, 2, 0))
|
127
|
-
assert_equal('E3}JvG0rGFKwgpHD', osp.password('host2', 16, 2, 1))
|
128
|
-
assert_equal('E3}J[G0rGFKwgpHD', osp.password('host2', 16, 2, 2))
|
129
|
-
assert_equal('E3}J[G0+GFKwgpHD', osp.password('host2', 16, 2, 3))
|
130
|
-
|
131
|
-
assert_equal('7p51OI3QRAKGUcUc', osp.password('host2', 16, 3, 0))
|
132
|
-
assert_equal('~p51OI3QRAKGUcUc', osp.password('host2', 16, 3, 1))
|
133
|
-
assert_equal('~p/1OI3QRAKGUcUc', osp.password('host2', 16, 3, 2))
|
134
|
-
assert_equal('~p/<OI3QRAKGUcUc', osp.password('host2', 16, 3, 3))
|
135
|
-
end
|
136
|
-
end
|
data/tests/ts_all.rb
DELETED