trocla 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|