trocla 0.4.0 → 0.5.0
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/.github/workflows/ruby.yml +24 -0
- data/.rspec +1 -1
- data/CHANGELOG.md +11 -0
- data/Gemfile +10 -9
- data/README.md +18 -2
- data/bin/trocla +42 -42
- data/lib/VERSION +1 -1
- data/lib/trocla/default_config.yaml +3 -4
- data/lib/trocla/encryptions/none.rb +0 -1
- data/lib/trocla/encryptions/ssl.rb +11 -11
- data/lib/trocla/encryptions.rb +12 -5
- data/lib/trocla/formats/bcrypt.rb +2 -2
- data/lib/trocla/formats/md5crypt.rb +2 -2
- data/lib/trocla/formats/mysql.rb +2 -2
- data/lib/trocla/formats/pgsql.rb +50 -3
- data/lib/trocla/formats/plain.rb +1 -3
- data/lib/trocla/formats/sha1.rb +1 -1
- data/lib/trocla/formats/sha256crypt.rb +2 -2
- data/lib/trocla/formats/sha512crypt.rb +2 -2
- data/lib/trocla/formats/ssha.rb +3 -3
- data/lib/trocla/formats/sshkey.rb +4 -8
- data/lib/trocla/formats/wireguard.rb +45 -0
- data/lib/trocla/formats/x509.rb +54 -46
- data/lib/trocla/formats.rb +15 -5
- data/lib/trocla/store.rb +16 -15
- data/lib/trocla/stores/memory.rb +17 -10
- data/lib/trocla/stores/moneta.rb +29 -19
- data/lib/trocla/stores/vault.rb +42 -14
- data/lib/trocla/stores.rb +3 -2
- data/lib/trocla/util.rb +28 -17
- data/lib/trocla/version.rb +7 -4
- data/lib/trocla.rb +47 -45
- data/spec/trocla/formats/pgsql_spec.rb +25 -0
- data/spec/trocla_spec.rb +3 -0
- data/trocla.gemspec +17 -13
- metadata +30 -14
- data/.travis.yml +0 -6
data/lib/trocla/util.rb
CHANGED
@@ -1,30 +1,30 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
class Trocla
|
3
|
+
# Utils
|
3
4
|
class Util
|
4
5
|
class << self
|
5
|
-
def random_str(length=12, charset='default')
|
6
|
-
|
7
|
-
|
6
|
+
def random_str(length = 12, charset = 'default')
|
7
|
+
char = charsets[charset] || charsets['default']
|
8
|
+
charsets_size = char.size
|
9
|
+
(1..length).collect { |_| char[rand_num(charsets_size)] }.join.to_s
|
8
10
|
end
|
9
11
|
|
10
|
-
def salt(length=8)
|
11
|
-
|
12
|
-
(1..length).collect{|a| alphanumeric[SecureRandom.random_number(alphanumeric_size)] }.join.to_s
|
12
|
+
def salt(length = 8)
|
13
|
+
random_str(length, 'alphanumeric')
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
17
|
|
18
|
+
def rand_num(n)
|
19
|
+
SecureRandom.random_number(n)
|
20
|
+
end
|
21
|
+
|
17
22
|
def charsets
|
18
23
|
@charsets ||= begin
|
19
24
|
h = {
|
20
|
-
'default'
|
21
|
-
'
|
22
|
-
'
|
23
|
-
'windowssafe' => windowssafe,
|
24
|
-
'numeric' => numeric,
|
25
|
-
'hexadecimal' => hexadecimal,
|
26
|
-
'consolesafe' => consolesafe,
|
27
|
-
'typesafe' => typesafe,
|
25
|
+
'default' => chars, 'alphanumeric' => alphanumeric, 'shellsafe' => shellsafe,
|
26
|
+
'windowssafe' => windowssafe, 'numeric' => numeric, 'hexadecimal' => hexadecimal,
|
27
|
+
'consolesafe' => consolesafe, 'typesafe' => typesafe
|
28
28
|
}
|
29
29
|
h.each { |k, v| h[k] = v.uniq }
|
30
30
|
end
|
@@ -33,36 +33,47 @@ class Trocla
|
|
33
33
|
def chars
|
34
34
|
@chars ||= shellsafe + special_chars
|
35
35
|
end
|
36
|
+
|
36
37
|
def shellsafe
|
37
38
|
@shellsafe ||= alphanumeric + shellsafe_chars
|
38
39
|
end
|
40
|
+
|
39
41
|
def windowssafe
|
40
42
|
@windowssafe ||= alphanumeric + windowssafe_chars
|
41
43
|
end
|
44
|
+
|
42
45
|
def consolesafe
|
43
46
|
@consolesafe ||= alphanumeric + consolesafe_chars
|
44
47
|
end
|
48
|
+
|
45
49
|
def hexadecimal
|
46
50
|
@hexadecimal ||= numeric + ('a'..'f').to_a
|
47
51
|
end
|
52
|
+
|
48
53
|
def alphanumeric
|
49
54
|
@alphanumeric ||= ('a'..'z').to_a + ('A'..'Z').to_a + numeric
|
50
55
|
end
|
56
|
+
|
51
57
|
def numeric
|
52
58
|
@numeric ||= ('0'..'9').to_a
|
53
59
|
end
|
60
|
+
|
54
61
|
def typesafe
|
55
62
|
@typesafe ||= ('a'..'x').to_a - ['i'] - ['l'] + ('A'..'X').to_a - ['I'] - ['L'] + ('1'..'9').to_a
|
56
63
|
end
|
64
|
+
|
57
65
|
def special_chars
|
58
|
-
@special_chars ||=
|
66
|
+
@special_chars ||= '*()&![]{}-'.split(//)
|
59
67
|
end
|
68
|
+
|
60
69
|
def shellsafe_chars
|
61
|
-
@shellsafe_chars ||=
|
70
|
+
@shellsafe_chars ||= '+%/@=?_.,:'.split(//)
|
62
71
|
end
|
72
|
+
|
63
73
|
def windowssafe_chars
|
64
|
-
@windowssafe_chars ||=
|
74
|
+
@windowssafe_chars ||= '+%/@=?_.,'.split(//)
|
65
75
|
end
|
76
|
+
|
66
77
|
def consolesafe_chars
|
67
78
|
@consolesafe_chars ||= '+.-,_'.split(//)
|
68
79
|
end
|
data/lib/trocla/version.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
|
2
3
|
class Trocla
|
4
|
+
# VERSION
|
3
5
|
class VERSION
|
4
6
|
version = {}
|
5
7
|
File.read(File.join(File.dirname(__FILE__), '../', 'VERSION')).each_line do |line|
|
6
|
-
type, value = line.chomp.split(
|
8
|
+
type, value = line.chomp.split(':')
|
7
9
|
next if type =~ /^\s+$/ || value =~ /^\s+$/
|
10
|
+
|
8
11
|
version[type] = value
|
9
12
|
end
|
10
|
-
|
13
|
+
|
11
14
|
MAJOR = version['major']
|
12
15
|
MINOR = version['minor']
|
13
16
|
PATCH = version['patch']
|
14
17
|
BUILD = version['build']
|
15
|
-
|
18
|
+
|
16
19
|
STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
|
17
|
-
|
20
|
+
|
18
21
|
def self.version
|
19
22
|
STRING
|
20
23
|
end
|
data/lib/trocla.rb
CHANGED
@@ -4,16 +4,17 @@ require 'trocla/formats'
|
|
4
4
|
require 'trocla/encryptions'
|
5
5
|
require 'trocla/stores'
|
6
6
|
|
7
|
+
# Trocla class
|
7
8
|
class Trocla
|
8
|
-
def initialize(config_file=nil)
|
9
|
+
def initialize(config_file = nil)
|
9
10
|
if config_file
|
10
11
|
@config_file = File.expand_path(config_file)
|
11
|
-
elsif File.
|
12
|
+
elsif File.exist?(def_config_file = File.expand_path('~/.troclarc.yaml')) || File.exist?(def_config_file = File.expand_path('/etc/troclarc.yaml'))
|
12
13
|
@config_file = def_config_file
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
16
|
-
def self.open(config_file=nil)
|
17
|
+
def self.open(config_file = nil)
|
17
18
|
trocla = Trocla.new(config_file)
|
18
19
|
|
19
20
|
if block_given?
|
@@ -24,78 +25,76 @@ class Trocla
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
27
|
-
def password(key,format,options={})
|
28
|
+
def password(key, format, options={})
|
28
29
|
# respect a default profile, but let the
|
29
30
|
# profiles win over the default options
|
30
31
|
options['profiles'] ||= config['options']['profiles']
|
31
|
-
if options['profiles']
|
32
|
-
options = merge_profiles(options['profiles']).merge(options)
|
33
|
-
end
|
32
|
+
options = merge_profiles(options['profiles']).merge(options) if options['profiles']
|
34
33
|
options = config['options'].merge(options)
|
35
34
|
|
36
35
|
raise "Format #{format} is not supported! Supported formats: #{Trocla::Formats.all.join(', ')}" unless Trocla::Formats::available?(format)
|
37
36
|
|
38
|
-
unless (password=get_password(key,format,options)).nil?
|
37
|
+
unless (password = get_password(key, format, options)).nil?
|
39
38
|
return password
|
40
39
|
end
|
41
40
|
|
42
|
-
plain_pwd = get_password(key,'plain',options)
|
41
|
+
plain_pwd = get_password(key, 'plain', options)
|
43
42
|
if options['random'] && plain_pwd.nil?
|
44
|
-
plain_pwd = Trocla::Util.random_str(options['length'].to_i,options['charset'])
|
45
|
-
set_password(key,'plain',plain_pwd,options) unless format == 'plain'
|
43
|
+
plain_pwd = Trocla::Util.random_str(options['length'].to_i, options['charset'])
|
44
|
+
set_password(key, 'plain', plain_pwd, options) unless format == 'plain'
|
46
45
|
elsif !options['random'] && plain_pwd.nil?
|
47
46
|
raise "Password must be present as plaintext if you don't want a random password"
|
48
47
|
end
|
49
|
-
pwd = self.formats(format).format(plain_pwd,options)
|
48
|
+
pwd = self.formats(format).format(plain_pwd, options)
|
50
49
|
# it's possible that meanwhile another thread/process was faster in
|
51
50
|
# formating the password. But we want todo that second lookup
|
52
51
|
# only for expensive formats
|
53
52
|
if self.formats(format).expensive?
|
54
|
-
get_password(key,format,options) || set_password(key, format, pwd, options)
|
53
|
+
get_password(key, format, options) || set_password(key, format, pwd, options)
|
55
54
|
else
|
56
55
|
set_password(key, format, pwd, options)
|
57
56
|
end
|
58
57
|
end
|
59
58
|
|
60
|
-
def get_password(key, format, options={})
|
61
|
-
render(format,decrypt(store.get(key,format)),options)
|
59
|
+
def get_password(key, format, options = {})
|
60
|
+
render(format, decrypt(store.get(key, format)), options)
|
62
61
|
end
|
63
62
|
|
64
|
-
def reset_password(key,format,options={})
|
65
|
-
delete_password(key,format)
|
66
|
-
password(key,format,options)
|
63
|
+
def reset_password(key, format, options = {})
|
64
|
+
delete_password(key, format)
|
65
|
+
password(key, format, options)
|
67
66
|
end
|
68
67
|
|
69
|
-
def delete_password(key,format=nil,options={})
|
70
|
-
v = store.delete(key,format)
|
68
|
+
def delete_password(key, format = nil, options = {})
|
69
|
+
v = store.delete(key, format)
|
71
70
|
if v.is_a?(Hash)
|
72
|
-
Hash[*v.map do |f,encrypted_value|
|
73
|
-
[f,render(format,decrypt(encrypted_value),options)]
|
71
|
+
Hash[*v.map do |f, encrypted_value|
|
72
|
+
[f, render(format, decrypt(encrypted_value), options)]
|
74
73
|
end.flatten]
|
75
74
|
else
|
76
|
-
render(format,decrypt(v),options)
|
75
|
+
render(format, decrypt(v), options)
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
80
|
-
def set_password(key,format,password,options={})
|
81
|
-
store.set(key,format,encrypt(password),options)
|
82
|
-
render(format,password,options)
|
79
|
+
def set_password(key, format, password, options = {})
|
80
|
+
store.set(key, format, encrypt(password), options)
|
81
|
+
render(format, password, options)
|
83
82
|
end
|
84
83
|
|
85
|
-
def available_format(key, options={})
|
86
|
-
render(false,store.formats(key),options)
|
84
|
+
def available_format(key, options = {})
|
85
|
+
render(false, store.formats(key), options)
|
87
86
|
end
|
88
87
|
|
89
|
-
def search_key(key, options={})
|
90
|
-
render(false,store.search(key),options)
|
88
|
+
def search_key(key, options = {})
|
89
|
+
render(false, store.search(key), options)
|
91
90
|
end
|
92
91
|
|
93
92
|
def formats(format)
|
94
|
-
(@format_cache||={})[format] ||= Trocla::Formats[format].new(self)
|
93
|
+
(@format_cache ||= {})[format] ||= Trocla::Formats[format].new(self)
|
95
94
|
end
|
96
95
|
|
97
96
|
def encryption
|
98
|
-
@encryption ||= Trocla::Encryptions[config['encryption']].new(config['encryption_options'],self)
|
97
|
+
@encryption ||= Trocla::Encryptions[config['encryption']].new(config['encryption_options'], self)
|
99
98
|
end
|
100
99
|
|
101
100
|
def config
|
@@ -107,6 +106,7 @@ class Trocla
|
|
107
106
|
end
|
108
107
|
|
109
108
|
private
|
109
|
+
|
110
110
|
def store
|
111
111
|
@store ||= build_store
|
112
112
|
end
|
@@ -114,19 +114,20 @@ class Trocla
|
|
114
114
|
def build_store
|
115
115
|
s = config['store']
|
116
116
|
clazz = if s.is_a?(Symbol)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
clazz.new(config['store_options'],self)
|
117
|
+
Trocla::Stores[s]
|
118
|
+
else
|
119
|
+
require config['store_require'] if config['store_require']
|
120
|
+
eval(s)
|
121
|
+
end
|
122
|
+
clazz.new(config['store_options'], self)
|
123
123
|
end
|
124
124
|
|
125
125
|
def read_config
|
126
126
|
if @config_file.nil?
|
127
127
|
default_config
|
128
128
|
else
|
129
|
-
raise "Configfile #{@config_file} does not exist!" unless File.
|
129
|
+
raise "Configfile #{@config_file} does not exist!" unless File.exist?(@config_file)
|
130
|
+
|
130
131
|
c = default_config.merge(YAML.load(File.read(@config_file)))
|
131
132
|
c['profiles'] = default_config['profiles'].merge(c['profiles'])
|
132
133
|
# migrate all options to new store options
|
@@ -144,12 +145,13 @@ class Trocla
|
|
144
145
|
|
145
146
|
def decrypt(value)
|
146
147
|
return nil if value.nil?
|
148
|
+
|
147
149
|
encryption.decrypt(value)
|
148
150
|
end
|
149
151
|
|
150
|
-
def render(format,output,options={})
|
151
|
-
if format && output && f=self.formats(format)
|
152
|
-
f.render(output,options['render']||{})
|
152
|
+
def render(format, output, options = {})
|
153
|
+
if format && output && f = self.formats(format)
|
154
|
+
f.render(output, options['render'] || {})
|
153
155
|
else
|
154
156
|
output
|
155
157
|
end
|
@@ -157,14 +159,14 @@ class Trocla
|
|
157
159
|
|
158
160
|
def default_config
|
159
161
|
require 'yaml'
|
160
|
-
YAML.load(File.read(File.expand_path(File.join(File.dirname(__FILE__),'trocla','default_config.yaml'))))
|
162
|
+
YAML.load(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'trocla', 'default_config.yaml'))))
|
161
163
|
end
|
162
164
|
|
163
165
|
def merge_profiles(profiles)
|
164
|
-
Array(profiles).inject({}) do |res,profile|
|
166
|
+
Array(profiles).inject({}) do |res, profile|
|
165
167
|
raise "No such profile #{profile} defined" unless profile_hash = config['profiles'][profile]
|
168
|
+
|
166
169
|
profile_hash.merge(res)
|
167
170
|
end
|
168
171
|
end
|
169
|
-
|
170
172
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe 'Trocla::Format::Pgsql' do
|
4
|
+
before(:each) do
|
5
|
+
expect_any_instance_of(Trocla).to receive(:read_config).and_return(test_config)
|
6
|
+
@trocla = Trocla.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'default pgsql' do
|
10
|
+
it 'create a pgsql password keypair without options in sha256' do
|
11
|
+
pass = @trocla.password('pgsql_password_sh256', 'pgsql', {})
|
12
|
+
expect(pass).to match(/^SCRAM-SHA-256\$(.*):(.*)\$(.*):/)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'pgsql in md5 encode' do
|
17
|
+
it 'create a pgsql password in md5 encode' do
|
18
|
+
pass = @trocla.password(
|
19
|
+
'pgsql_password_md5', 'pgsql',
|
20
|
+
{ 'username' => 'toto', 'encode' => 'md5' }
|
21
|
+
)
|
22
|
+
expect(pass).to match(/^md5/)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/trocla_spec.rb
CHANGED
@@ -72,6 +72,9 @@ describe "Trocla" do
|
|
72
72
|
expect(pwd).not_to match(/[={}\[\]\?%\*()&!]+/)
|
73
73
|
end
|
74
74
|
it 'is possible to combine profiles but first profile wins 3' do
|
75
|
+
# mysql profile uses a 32 long random pwd with shell safe characters
|
76
|
+
# and we want to use a fixed random str here https://github.com/duritong/trocla/issues/55
|
77
|
+
allow(Trocla::Util).to receive(:random_str).with(32,'shellsafe') { "jmNi6+7dsUn@H?vfbXCq=ULEGPW,u:hu" }
|
75
78
|
pwd = @trocla.password('some_test3','plain', 'profiles' => ['mysql','login'])
|
76
79
|
expect(pwd).not_to be_empty
|
77
80
|
expect(pwd.length).to eq(32)
|
data/trocla.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: trocla 0.
|
5
|
+
# stub: trocla 0.5.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "trocla".freeze
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.5.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["mh".freeze]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2023-01-01"
|
15
15
|
s.description = "Trocla helps you to generate random passwords and to store them in various formats (plain, MD5, bcrypt) for later retrival.".freeze
|
16
16
|
s.email = "mh+trocla@immerda.ch".freeze
|
17
17
|
s.executables = ["trocla".freeze]
|
@@ -21,8 +21,8 @@ Gem::Specification.new do |s|
|
|
21
21
|
]
|
22
22
|
s.files = [
|
23
23
|
".document",
|
24
|
+
".github/workflows/ruby.yml",
|
24
25
|
".rspec",
|
25
|
-
".travis.yml",
|
26
26
|
"CHANGELOG.md",
|
27
27
|
"Gemfile",
|
28
28
|
"LICENSE.txt",
|
@@ -47,6 +47,7 @@ Gem::Specification.new do |s|
|
|
47
47
|
"lib/trocla/formats/sha512crypt.rb",
|
48
48
|
"lib/trocla/formats/ssha.rb",
|
49
49
|
"lib/trocla/formats/sshkey.rb",
|
50
|
+
"lib/trocla/formats/wireguard.rb",
|
50
51
|
"lib/trocla/formats/x509.rb",
|
51
52
|
"lib/trocla/store.rb",
|
52
53
|
"lib/trocla/stores.rb",
|
@@ -59,6 +60,7 @@ Gem::Specification.new do |s|
|
|
59
60
|
"spec/spec_helper.rb",
|
60
61
|
"spec/trocla/encryptions/none_spec.rb",
|
61
62
|
"spec/trocla/encryptions/ssl_spec.rb",
|
63
|
+
"spec/trocla/formats/pgsql_spec.rb",
|
62
64
|
"spec/trocla/formats/sshkey_spec.rb",
|
63
65
|
"spec/trocla/formats/x509_spec.rb",
|
64
66
|
"spec/trocla/store/memory_spec.rb",
|
@@ -69,7 +71,7 @@ Gem::Specification.new do |s|
|
|
69
71
|
]
|
70
72
|
s.homepage = "https://tech.immerda.ch/2011/12/trocla-get-hashed-passwords-out-of-puppet-manifests/".freeze
|
71
73
|
s.licenses = ["GPLv3".freeze]
|
72
|
-
s.rubygems_version = "3.
|
74
|
+
s.rubygems_version = "3.3.26".freeze
|
73
75
|
s.summary = "Trocla a simple password generator and storage".freeze
|
74
76
|
|
75
77
|
if s.respond_to? :specification_version then
|
@@ -77,24 +79,26 @@ Gem::Specification.new do |s|
|
|
77
79
|
end
|
78
80
|
|
79
81
|
if s.respond_to? :add_runtime_dependency then
|
80
|
-
s.add_runtime_dependency(%q<moneta>.freeze, ["~> 1.4.0"])
|
81
82
|
s.add_runtime_dependency(%q<highline>.freeze, ["~> 2.0.0"])
|
83
|
+
s.add_runtime_dependency(%q<moneta>.freeze, ["~> 1.4.0"])
|
82
84
|
s.add_runtime_dependency(%q<bcrypt>.freeze, [">= 0"])
|
85
|
+
s.add_runtime_dependency(%q<openssl>.freeze, [">= 0"])
|
83
86
|
s.add_runtime_dependency(%q<sshkey>.freeze, [">= 0"])
|
84
|
-
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
85
|
-
s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
|
86
|
-
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
87
87
|
s.add_development_dependency(%q<addressable>.freeze, [">= 0"])
|
88
|
+
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
89
|
+
s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
|
90
|
+
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
88
91
|
s.add_development_dependency(%q<rspec-pending_for>.freeze, [">= 0"])
|
89
92
|
else
|
90
|
-
s.add_dependency(%q<moneta>.freeze, ["~> 1.4.0"])
|
91
93
|
s.add_dependency(%q<highline>.freeze, ["~> 2.0.0"])
|
94
|
+
s.add_dependency(%q<moneta>.freeze, ["~> 1.4.0"])
|
92
95
|
s.add_dependency(%q<bcrypt>.freeze, [">= 0"])
|
96
|
+
s.add_dependency(%q<openssl>.freeze, [">= 0"])
|
93
97
|
s.add_dependency(%q<sshkey>.freeze, [">= 0"])
|
94
|
-
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
95
|
-
s.add_dependency(%q<rdoc>.freeze, [">= 0"])
|
96
|
-
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
97
98
|
s.add_dependency(%q<addressable>.freeze, [">= 0"])
|
99
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
100
|
+
s.add_dependency(%q<rdoc>.freeze, [">= 0"])
|
101
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
98
102
|
s.add_dependency(%q<rspec-pending_for>.freeze, [">= 0"])
|
99
103
|
end
|
100
104
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trocla
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: highline
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: moneta
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.4.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bcrypt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: openssl
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: sshkey
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,7 +81,7 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: addressable
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
@@ -81,7 +95,7 @@ dependencies:
|
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: jeweler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - ">="
|
@@ -95,7 +109,7 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: rdoc
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ">="
|
@@ -109,7 +123,7 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: rspec
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
@@ -147,8 +161,8 @@ extra_rdoc_files:
|
|
147
161
|
- README.md
|
148
162
|
files:
|
149
163
|
- ".document"
|
164
|
+
- ".github/workflows/ruby.yml"
|
150
165
|
- ".rspec"
|
151
|
-
- ".travis.yml"
|
152
166
|
- CHANGELOG.md
|
153
167
|
- Gemfile
|
154
168
|
- LICENSE.txt
|
@@ -173,6 +187,7 @@ files:
|
|
173
187
|
- lib/trocla/formats/sha512crypt.rb
|
174
188
|
- lib/trocla/formats/ssha.rb
|
175
189
|
- lib/trocla/formats/sshkey.rb
|
190
|
+
- lib/trocla/formats/wireguard.rb
|
176
191
|
- lib/trocla/formats/x509.rb
|
177
192
|
- lib/trocla/store.rb
|
178
193
|
- lib/trocla/stores.rb
|
@@ -185,6 +200,7 @@ files:
|
|
185
200
|
- spec/spec_helper.rb
|
186
201
|
- spec/trocla/encryptions/none_spec.rb
|
187
202
|
- spec/trocla/encryptions/ssl_spec.rb
|
203
|
+
- spec/trocla/formats/pgsql_spec.rb
|
188
204
|
- spec/trocla/formats/sshkey_spec.rb
|
189
205
|
- spec/trocla/formats/x509_spec.rb
|
190
206
|
- spec/trocla/store/memory_spec.rb
|
@@ -211,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
227
|
- !ruby/object:Gem::Version
|
212
228
|
version: '0'
|
213
229
|
requirements: []
|
214
|
-
rubygems_version: 3.
|
230
|
+
rubygems_version: 3.3.26
|
215
231
|
signing_key:
|
216
232
|
specification_version: 4
|
217
233
|
summary: Trocla a simple password generator and storage
|