trocla 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
- _charsets = charsets[charset] || charsets['default']
7
- (1..length).collect{|a| _charsets[SecureRandom.random_number(_charsets.size)] }.join.to_s
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
- alphanumeric_size = alphanumeric.size
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' => chars,
21
- 'alphanumeric' => alphanumeric,
22
- 'shellsafe' => shellsafe,
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 ||= "*()&![]{}-".split(//)
66
+ @special_chars ||= '*()&![]{}-'.split(//)
59
67
  end
68
+
60
69
  def shellsafe_chars
61
- @shellsafe_chars ||= "+%/@=?_.,:".split(//)
70
+ @shellsafe_chars ||= '+%/@=?_.,:'.split(//)
62
71
  end
72
+
63
73
  def windowssafe_chars
64
- @windowssafe_chars ||= "+%/@=?_.,".split(//)
74
+ @windowssafe_chars ||= '+%/@=?_.,'.split(//)
65
75
  end
76
+
66
77
  def consolesafe_chars
67
78
  @consolesafe_chars ||= '+.-,_'.split(//)
68
79
  end
@@ -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.exists?(def_config_file=File.expand_path('~/.troclarc.yaml')) || File.exists?(def_config_file=File.expand_path('/etc/troclarc.yaml'))
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
- 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)
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.exists?(@config_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.4.0 ruby lib
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.4.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 = "2021-05-11"
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.1.2".freeze
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.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: 2021-05-11 00:00:00.000000000 Z
11
+ date: 2023-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: moneta
14
+ name: highline
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.4.0
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: 1.4.0
26
+ version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: highline
28
+ name: moneta
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0
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: 2.0.0
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: rspec
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: rdoc
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: jeweler
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: addressable
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.1.2
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
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- language: ruby
2
- sudo: false
3
- rvm:
4
- - jruby
5
- - 2.7.0
6
- - 3.0.0