sfn-vault 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -4
- data/LICENSE +201 -201
- data/README.md +86 -5
- data/lib/sfn-vault.rb +9 -149
- data/lib/sfn-vault/callback.rb +224 -0
- data/lib/sfn-vault/certificate_store.rb +40 -0
- data/lib/sfn-vault/inject.rb +18 -0
- data/lib/sfn-vault/platform.rb +17 -0
- data/lib/sfn-vault/utils.rb +56 -0
- data/lib/sfn-vault/version.rb +1 -1
- data/lib/sfn-vault/windows.rb +10 -0
- data/lib/sfn-vault/windows/root_certs.rb +110 -0
- data/sfn-vault.gemspec +4 -2
- metadata +49 -13
- data/bin/coderay +0 -17
- data/bin/generate_sparkle_docs +0 -17
- data/bin/graph +0 -17
- data/bin/pry +0 -17
- data/bin/sfn +0 -17
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'sfn-vault'
|
2
|
+
|
3
|
+
module SfnVault
|
4
|
+
module Utils
|
5
|
+
|
6
|
+
def vault_client
|
7
|
+
certs = SfnVault::CertificateStore.default_ssl_cert_store
|
8
|
+
|
9
|
+
conf = {
|
10
|
+
address: vault_addr,
|
11
|
+
token: vault_token,
|
12
|
+
}
|
13
|
+
conf.merge!({ssl_ca_path: '/etc/ssl/certs'}) unless SfnVault::Platform.windows?
|
14
|
+
conf.merge!({ssl_cert_store: certs}) if certs
|
15
|
+
|
16
|
+
client = Vault::Client.new(conf)
|
17
|
+
client
|
18
|
+
end
|
19
|
+
|
20
|
+
def vault_addr
|
21
|
+
address = config.fetch(:vault, :vault_addr, ENV['VAULT_ADDR'])
|
22
|
+
if address.nil?
|
23
|
+
ui.error 'Set vault_addr in .sfn or VAULT_ADDR in environment'
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
ui.debug "Vault address is #{address}"
|
27
|
+
address
|
28
|
+
end
|
29
|
+
|
30
|
+
def vault_token
|
31
|
+
token = config.fetch(:vault, :vault_token, ENV['VAULT_TOKEN'])
|
32
|
+
if token.nil?
|
33
|
+
ui.error 'Set :vault_token in .sfn or VAULT_TOKEN in environment'
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
ui.debug "Vault token is #{token}"
|
37
|
+
token
|
38
|
+
end
|
39
|
+
|
40
|
+
# Test write/read/delete operations
|
41
|
+
# to determine if we can save a secret
|
42
|
+
# @param [Vault::Client] client
|
43
|
+
# @return [TrueClass, FalseClass]
|
44
|
+
def vault_writeable?(client)
|
45
|
+
secret = 'cubbyhole/SfnVaultCallbackCheck'
|
46
|
+
value = 'ensure_writeable'
|
47
|
+
if client.logical.write(secret, value: value)
|
48
|
+
read = client.logical.read(test_secret)
|
49
|
+
client.logical.delete(test_secret)
|
50
|
+
if read.data == value
|
51
|
+
return true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/sfn-vault/version.rb
CHANGED
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'ffi'
|
3
|
+
|
4
|
+
# This class abstracts operations with the Windows certificate store and hides
|
5
|
+
# ugly ffi functions
|
6
|
+
module SfnVault
|
7
|
+
class Windows
|
8
|
+
class RootCerts
|
9
|
+
include Enumerable
|
10
|
+
extend FFI::Library
|
11
|
+
|
12
|
+
typedef :ulong, :dword
|
13
|
+
typedef :uintptr_t, :handle
|
14
|
+
|
15
|
+
def initialize(roots)
|
16
|
+
@roots = roots
|
17
|
+
end
|
18
|
+
|
19
|
+
# Enumerates each root certificate.
|
20
|
+
# @yieldparam cert [OpenSSL::X509::Certificate] each root certificate
|
21
|
+
# @api public
|
22
|
+
def each
|
23
|
+
@roots.each { |cert| yield cert }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns a new instance.
|
27
|
+
# @return [TrustedRootsStore::RootCerts] object constructed from current root certificates
|
28
|
+
def self.instance
|
29
|
+
new(load_certs)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns an array of root certificates.
|
33
|
+
#
|
34
|
+
# @return [Array<[OpenSSL::X509::Certificate]>] an array of root certificates
|
35
|
+
# @api private
|
36
|
+
# rubocop:disable all
|
37
|
+
def self.load_certs
|
38
|
+
certs = []
|
39
|
+
|
40
|
+
# This is based on a patch submitted to openssl:
|
41
|
+
# http://www.mail-archive.com/openssl-dev@openssl.org/msg26958.html
|
42
|
+
ptr = FFI::Pointer::NULL
|
43
|
+
# This could be smarter and extend FFI usage to enumerate stores
|
44
|
+
# through CertEnumSystemStore:
|
45
|
+
# see: https://msdn.microsoft.com/en-us/library/aa376058(v=vs.85).aspx
|
46
|
+
|
47
|
+
%w(ROOT CA).each do |system_store|
|
48
|
+
store = CertOpenSystemStoreA(nil, system_store)
|
49
|
+
begin
|
50
|
+
while (ptr = CertEnumCertificatesInStore(store, ptr)) and not ptr.null?
|
51
|
+
context = CertContext.new(ptr)
|
52
|
+
cert_buf = context[:pbCertEncoded].read_bytes(context[:cbCertEncoded])
|
53
|
+
begin
|
54
|
+
certs << OpenSSL::X509::Certificate.new(cert_buf)
|
55
|
+
rescue => detail
|
56
|
+
warn("Failed to import certificate: #{detail.inspect} from #{system_store}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
ensure
|
60
|
+
CertCloseStore(store, 0)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
certs
|
65
|
+
end
|
66
|
+
# rubocop:enable all
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# typedef ULONG_PTR HCRYPTPROV_LEGACY;
|
71
|
+
# typedef void *HCERTSTORE;
|
72
|
+
class CertContext < FFI::Struct
|
73
|
+
layout(
|
74
|
+
:dwCertEncodingType, :dword,
|
75
|
+
:pbCertEncoded, :pointer,
|
76
|
+
:cbCertEncoded, :dword,
|
77
|
+
:pCertInfo, :pointer,
|
78
|
+
:hCertStore, :handle
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
# HCERTSTORE
|
83
|
+
# WINAPI
|
84
|
+
# CertOpenSystemStoreA(
|
85
|
+
# __in_opt HCRYPTPROV_LEGACY hProv,
|
86
|
+
# __in LPCSTR szSubsystemProtocol
|
87
|
+
# );
|
88
|
+
ffi_lib :crypt32
|
89
|
+
attach_function :CertOpenSystemStoreA, [:pointer, :string], :handle
|
90
|
+
|
91
|
+
# PCCERT_CONTEXT
|
92
|
+
# WINAPI
|
93
|
+
# CertEnumCertificatesInStore(
|
94
|
+
# __in HCERTSTORE hCertStore,
|
95
|
+
# __in_opt PCCERT_CONTEXT pPrevCertContext
|
96
|
+
# );
|
97
|
+
ffi_lib :crypt32
|
98
|
+
attach_function :CertEnumCertificatesInStore, [:handle, :pointer], :pointer
|
99
|
+
|
100
|
+
# BOOL
|
101
|
+
# WINAPI
|
102
|
+
# CertCloseStore(
|
103
|
+
# __in_opt HCERTSTORE hCertStore,
|
104
|
+
# __in DWORD dwFlags
|
105
|
+
# );
|
106
|
+
ffi_lib :crypt32
|
107
|
+
attach_function :CertCloseStore, [:handle, :dword], :bool
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/sfn-vault.gemspec
CHANGED
@@ -11,8 +11,10 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.license = 'Apache-2.0'
|
12
12
|
s.require_path = 'lib'
|
13
13
|
s.add_dependency 'sfn', '>= 3.0', '< 4.0'
|
14
|
-
s.add_dependency 'vault', '~> 0.
|
14
|
+
s.add_dependency 'vault', '~> 0.9.0'
|
15
|
+
s.add_dependency 'ffi', '~> 1.9.14'
|
15
16
|
s.add_development_dependency 'pry', '~> 0.10.4'
|
16
|
-
s.add_development_dependency 'pry-
|
17
|
+
s.add_development_dependency 'pry-byebug', '~> 3.4', '>= 3.4.2'
|
18
|
+
s.add_development_dependency 'rb-readline', '~> 0.5.3'
|
17
19
|
s.files = Dir['{lib,bin,docs}/**/*'] + %w(sfn-vault.gemspec README.md CHANGELOG.md LICENSE)
|
18
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sfn-vault
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Escriva
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sfn
|
@@ -36,14 +36,28 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.
|
39
|
+
version: 0.9.0
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
46
|
+
version: 0.9.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ffi
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.9.14
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.9.14
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: pry
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,19 +73,39 @@ dependencies:
|
|
59
73
|
- !ruby/object:Gem::Version
|
60
74
|
version: 0.10.4
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
|
-
name: pry-
|
76
|
+
name: pry-byebug
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.4'
|
65
82
|
- - ">="
|
66
83
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
84
|
+
version: 3.4.2
|
68
85
|
type: :development
|
69
86
|
prerelease: false
|
70
87
|
version_requirements: !ruby/object:Gem::Requirement
|
71
88
|
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '3.4'
|
72
92
|
- - ">="
|
73
93
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
94
|
+
version: 3.4.2
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rb-readline
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.5.3
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.5.3
|
75
109
|
description: SparkleFormation Vault Callback
|
76
110
|
email: sean.escriva@gmail.com
|
77
111
|
executables: []
|
@@ -81,13 +115,15 @@ files:
|
|
81
115
|
- CHANGELOG.md
|
82
116
|
- LICENSE
|
83
117
|
- README.md
|
84
|
-
- bin/coderay
|
85
|
-
- bin/generate_sparkle_docs
|
86
|
-
- bin/graph
|
87
|
-
- bin/pry
|
88
|
-
- bin/sfn
|
89
118
|
- lib/sfn-vault.rb
|
119
|
+
- lib/sfn-vault/callback.rb
|
120
|
+
- lib/sfn-vault/certificate_store.rb
|
121
|
+
- lib/sfn-vault/inject.rb
|
122
|
+
- lib/sfn-vault/platform.rb
|
123
|
+
- lib/sfn-vault/utils.rb
|
90
124
|
- lib/sfn-vault/version.rb
|
125
|
+
- lib/sfn-vault/windows.rb
|
126
|
+
- lib/sfn-vault/windows/root_certs.rb
|
91
127
|
- sfn-vault.gemspec
|
92
128
|
homepage: http://github.com/webframp/sfn-vault
|
93
129
|
licenses:
|
@@ -109,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
145
|
version: '0'
|
110
146
|
requirements: []
|
111
147
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.6.
|
148
|
+
rubygems_version: 2.6.10
|
113
149
|
signing_key:
|
114
150
|
specification_version: 4
|
115
151
|
summary: SparkleFormation Vault Callback
|
data/bin/coderay
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
#
|
4
|
-
# This file was generated by Bundler.
|
5
|
-
#
|
6
|
-
# The application 'coderay' is installed as part of a gem, and
|
7
|
-
# this file is here to facilitate running it.
|
8
|
-
#
|
9
|
-
|
10
|
-
require "pathname"
|
11
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
Pathname.new(__FILE__).realpath)
|
13
|
-
|
14
|
-
require "rubygems"
|
15
|
-
require "bundler/setup"
|
16
|
-
|
17
|
-
load Gem.bin_path("coderay", "coderay")
|
data/bin/generate_sparkle_docs
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
#
|
4
|
-
# This file was generated by Bundler.
|
5
|
-
#
|
6
|
-
# The application 'generate_sparkle_docs' is installed as part of a gem, and
|
7
|
-
# this file is here to facilitate running it.
|
8
|
-
#
|
9
|
-
|
10
|
-
require "pathname"
|
11
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
Pathname.new(__FILE__).realpath)
|
13
|
-
|
14
|
-
require "rubygems"
|
15
|
-
require "bundler/setup"
|
16
|
-
|
17
|
-
load Gem.bin_path("sparkle_formation", "generate_sparkle_docs")
|
data/bin/graph
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
#
|
4
|
-
# This file was generated by Bundler.
|
5
|
-
#
|
6
|
-
# The application 'graph' is installed as part of a gem, and
|
7
|
-
# this file is here to facilitate running it.
|
8
|
-
#
|
9
|
-
|
10
|
-
require "pathname"
|
11
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
Pathname.new(__FILE__).realpath)
|
13
|
-
|
14
|
-
require "rubygems"
|
15
|
-
require "bundler/setup"
|
16
|
-
|
17
|
-
load Gem.bin_path("graph", "graph")
|
data/bin/pry
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
#
|
4
|
-
# This file was generated by Bundler.
|
5
|
-
#
|
6
|
-
# The application 'pry' is installed as part of a gem, and
|
7
|
-
# this file is here to facilitate running it.
|
8
|
-
#
|
9
|
-
|
10
|
-
require "pathname"
|
11
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
Pathname.new(__FILE__).realpath)
|
13
|
-
|
14
|
-
require "rubygems"
|
15
|
-
require "bundler/setup"
|
16
|
-
|
17
|
-
load Gem.bin_path("pry", "pry")
|
data/bin/sfn
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
#
|
4
|
-
# This file was generated by Bundler.
|
5
|
-
#
|
6
|
-
# The application 'sfn' is installed as part of a gem, and
|
7
|
-
# this file is here to facilitate running it.
|
8
|
-
#
|
9
|
-
|
10
|
-
require "pathname"
|
11
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
-
Pathname.new(__FILE__).realpath)
|
13
|
-
|
14
|
-
require "rubygems"
|
15
|
-
require "bundler/setup"
|
16
|
-
|
17
|
-
load Gem.bin_path("sfn", "sfn")
|