proxy_rb 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env +3 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +8 -2
- data/Gemfile +7 -3
- data/README.md +42 -8
- data/Rakefile +8 -23
- data/bin/bootstrap +10 -0
- data/{script → bin}/console +1 -0
- data/bin/test +3 -0
- data/cucumber.yml +2 -0
- data/fixtures/proxy-config/.rspec +2 -0
- data/fixtures/proxy-config/README.md +18 -0
- data/fixtures/proxy-config/Rakefile +10 -0
- data/fixtures/proxy-config/bin/http_server +14 -0
- data/fixtures/proxy-config/spec/spec_helper.rb +8 -0
- data/fixtures/proxy-config/spec/support/aruba.rb +2 -0
- data/fixtures/proxy-config/spec/support/proxy_rb.rb +2 -0
- data/lib/proxy_rb/basic_configuration/in_config_wrapper.rb +28 -0
- data/lib/proxy_rb/basic_configuration/option.rb +32 -0
- data/lib/proxy_rb/basic_configuration.rb +148 -0
- data/lib/proxy_rb/configuration.rb +42 -0
- data/lib/proxy_rb/credentials.rb +52 -0
- data/lib/proxy_rb/errors.rb +5 -0
- data/lib/proxy_rb/http_downloader.rb +23 -0
- data/lib/proxy_rb/http_proxy.rb +52 -0
- data/lib/proxy_rb/main.rb +8 -2
- data/lib/proxy_rb/no_proxy.rb +26 -0
- data/lib/proxy_rb/password_fetchers/basic_password_fetcher.rb +12 -0
- data/lib/proxy_rb/password_fetchers/environment_password_fetcher.rb +34 -0
- data/lib/proxy_rb/password_fetchers/vault_password_fetcher.rb +47 -0
- data/lib/proxy_rb/password_fetchers.rb +6 -0
- data/lib/proxy_rb/proxy_url.rb +73 -0
- data/lib/proxy_rb/proxy_url_parser.rb +56 -0
- data/lib/proxy_rb/request.rb +36 -0
- data/lib/proxy_rb/resource.rb +28 -0
- data/lib/proxy_rb/response.rb +20 -0
- data/lib/proxy_rb/rspec/helpers/http_proxy.rb +78 -0
- data/lib/proxy_rb/rspec/helpers/passwords.rb +29 -0
- data/lib/proxy_rb/rspec.rb +9 -6
- data/lib/proxy_rb/user_passwords/environment_user_password.rb +30 -0
- data/lib/proxy_rb/user_passwords/vault_user_password.rb +27 -0
- data/lib/proxy_rb/user_passwords.rb +7 -0
- data/lib/proxy_rb/version.rb +2 -1
- data/lib/proxy_rb.rb +2 -0
- data/proxy_rb.gemspec +5 -3
- metadata +40 -9
- data/Gemfile.lock +0 -263
- data/script/bootstrap +0 -7
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'shellwords'
|
3
|
+
|
4
|
+
require 'proxy_rb/credentials'
|
5
|
+
require 'proxy_rb/proxy_url_parser'
|
6
|
+
|
7
|
+
# ProxyRb
|
8
|
+
module ProxyRb
|
9
|
+
# Represent proxy
|
10
|
+
class HttpProxy
|
11
|
+
protected
|
12
|
+
|
13
|
+
attr_reader :url, :credentials
|
14
|
+
|
15
|
+
public
|
16
|
+
|
17
|
+
def initialize(parser)
|
18
|
+
@url = parser.proxy_url
|
19
|
+
@credentials = parser.credentials
|
20
|
+
end
|
21
|
+
|
22
|
+
# Convert to parameters for PhantomJS
|
23
|
+
#
|
24
|
+
# @return [Array]
|
25
|
+
# An array of parameters for PhantomJS
|
26
|
+
def to_phantom_js
|
27
|
+
result = []
|
28
|
+
result << "--proxy=#{url}" unless url.empty?
|
29
|
+
result << "--proxy-auth=#{credentials}" unless credentials.empty?
|
30
|
+
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
# Convert to symbol to reference the proxy
|
35
|
+
#
|
36
|
+
# @return [Symbol]
|
37
|
+
# <host>_<port>_<credentials>
|
38
|
+
def to_sym
|
39
|
+
Shellwords.escape(*[host, port, credentials.user_name].compact.join('_')).to_sym
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def host
|
45
|
+
url.host
|
46
|
+
end
|
47
|
+
|
48
|
+
def port
|
49
|
+
url.port
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/proxy_rb/main.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'logger'
|
3
|
+
|
1
4
|
# Main
|
2
5
|
module ProxyRb
|
3
6
|
@debug_mode = false
|
7
|
+
@logger = Logger.new($stderr)
|
4
8
|
|
5
9
|
class << self
|
6
|
-
|
10
|
+
protected
|
7
11
|
|
8
12
|
attr_accessor :debug_mode
|
9
13
|
|
10
14
|
public
|
11
15
|
|
16
|
+
attr_reader :logger
|
17
|
+
|
12
18
|
def debug_mode_enabled?
|
13
19
|
debug_mode == true
|
14
20
|
end
|
@@ -18,7 +24,7 @@ module ProxyRb
|
|
18
24
|
%w(pry byebug).each { |l| require l }
|
19
25
|
end
|
20
26
|
|
21
|
-
def
|
27
|
+
def require_files_matching_pattern(pattern)
|
22
28
|
root = File.expand_path('../', __FILE__)
|
23
29
|
path = File.join(root, pattern)
|
24
30
|
Dir.glob(path).each { |f| require_relative f }
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# No proxy
|
2
|
+
class NoProxy
|
3
|
+
def self.to_s
|
4
|
+
""
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.nil?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.empty?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def nil?
|
16
|
+
self.class.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
self.class.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
""
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module ProxyRb
|
3
|
+
# Fetch password for user...
|
4
|
+
module PasswordFetchers
|
5
|
+
# ... process environment
|
6
|
+
class BasicPasswordFetcher
|
7
|
+
def call(_user_name)
|
8
|
+
raise NotImplementedError, 'You need to implement `#call` for a valid password fetcher'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'proxy_rb/password_fetchers/basic_password_fetcher'
|
3
|
+
require 'proxy_rb/user_passwords/environment_user_password'
|
4
|
+
|
5
|
+
module ProxyRb
|
6
|
+
# Fetch password for user...
|
7
|
+
module PasswordFetchers
|
8
|
+
# ... process environment
|
9
|
+
class EnvironmentPasswordFetcher < BasicPasswordFetcher
|
10
|
+
include Contracts::Core
|
11
|
+
include Contracts::Builtin
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
attr_reader :prefix
|
16
|
+
|
17
|
+
public
|
18
|
+
|
19
|
+
# Prefix of key in Environment
|
20
|
+
def initialize(prefix:)
|
21
|
+
@prefix = prefix
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [String] user_name
|
25
|
+
# Look up user name
|
26
|
+
Contract String => String
|
27
|
+
def call(user_name)
|
28
|
+
UserPasswords::EnvironmentUserPassword.new(
|
29
|
+
ENV[format('%s_%s', prefix, user_name.upcase)]
|
30
|
+
).to_s
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'proxy_rb/password_fetchers/basic_password_fetcher'
|
3
|
+
require 'proxy_rb/user_passwords/vault_user_password'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'vault'
|
7
|
+
rescue LoadError
|
8
|
+
ProxyRb.logger.error 'Please add `vault` to your `Gemfile` to use this password fetcher'
|
9
|
+
end
|
10
|
+
|
11
|
+
module ProxyRb
|
12
|
+
# Fetch password for user...
|
13
|
+
module PasswordFetchers
|
14
|
+
# ... from HashiCorp Vault
|
15
|
+
class VaultPasswordFetcher < BasicPasswordFetcher
|
16
|
+
include Contracts::Core
|
17
|
+
include Contracts::Builtin
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
attr_reader :prefix, :client
|
22
|
+
|
23
|
+
public
|
24
|
+
|
25
|
+
# @param [String] prefix
|
26
|
+
# Prefix used to look up password for user name
|
27
|
+
#
|
28
|
+
# @param [Vault::Client] client
|
29
|
+
# The client used to connect to central "Vault" server
|
30
|
+
def initialize(prefix:, client: ::Vault::Client.new(address: ENV['VAULT_ADDR']))
|
31
|
+
@prefix = prefix
|
32
|
+
@client = client
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param [String] user_name
|
36
|
+
# Look up user name
|
37
|
+
Contract String => String
|
38
|
+
def call(user_name)
|
39
|
+
client.with_retries(::Vault::HTTPConnectionError, ::Vault::HTTPError) do |_attempt, _e|
|
40
|
+
UserPasswords::VaultUserPassword.new(
|
41
|
+
::Vault.logical.read(File.join(prefix, user_name))
|
42
|
+
).to_s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'addressable/uri'
|
3
|
+
|
4
|
+
# ProxyRb
|
5
|
+
module ProxyRb
|
6
|
+
# A ProxyURL
|
7
|
+
class ProxyUrl
|
8
|
+
# Build a URL from hash
|
9
|
+
#
|
10
|
+
# @param [Hash] hash
|
11
|
+
# An Hash representing the url parts
|
12
|
+
#
|
13
|
+
# @return [ProxyUrl]
|
14
|
+
# The built url
|
15
|
+
def self.build(hash)
|
16
|
+
new(Addressable::URI.new(hash))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Create URL from string
|
20
|
+
#
|
21
|
+
# @param [String] string
|
22
|
+
# The url
|
23
|
+
#
|
24
|
+
# @return [ProxyUrl]
|
25
|
+
# The parsed url
|
26
|
+
def self.parse(string)
|
27
|
+
new(Addressable::URI.heuristic_parse(string.to_s))
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
attr_reader :url
|
33
|
+
|
34
|
+
public
|
35
|
+
|
36
|
+
def initialize(url)
|
37
|
+
@url = url
|
38
|
+
end
|
39
|
+
|
40
|
+
%i(host user password port).each do |m|
|
41
|
+
define_method m do
|
42
|
+
return nil if empty?
|
43
|
+
|
44
|
+
url.public_send m
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
return "" if empty?
|
50
|
+
|
51
|
+
url.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check if url is empty
|
55
|
+
def empty?
|
56
|
+
url.nil? || url.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
# Return URL without user name and password
|
60
|
+
#
|
61
|
+
# @return [ProxyUrl]
|
62
|
+
# The cleaned url
|
63
|
+
def without_user_name_and_password
|
64
|
+
return self.class.new(nil) if empty?
|
65
|
+
|
66
|
+
h = url.to_hash
|
67
|
+
h.delete :user
|
68
|
+
h.delete :password
|
69
|
+
|
70
|
+
self.class.build(h)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'uri'
|
3
|
+
require 'addressable/uri'
|
4
|
+
require 'proxy_rb/proxy_url'
|
5
|
+
|
6
|
+
# ProxyRb
|
7
|
+
module ProxyRb
|
8
|
+
# Parse urls for proxies
|
9
|
+
class ProxyUrlParser
|
10
|
+
protected
|
11
|
+
|
12
|
+
attr_reader :raw_url
|
13
|
+
|
14
|
+
public
|
15
|
+
|
16
|
+
attr_reader :proxy_url, :credentials
|
17
|
+
|
18
|
+
# @param [String] url
|
19
|
+
# The url for the proxy configuration
|
20
|
+
def initialize(url)
|
21
|
+
temporary_url = ProxyUrl.parse(url)
|
22
|
+
|
23
|
+
@proxy_url = temporary_url.without_user_name_and_password
|
24
|
+
@credentials = Credentials.new(temporary_url.user, temporary_url.password)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def url_hash_for_hostname_port
|
30
|
+
splitted_url = raw_url.to_s.split(/:/)
|
31
|
+
|
32
|
+
url_hash = {}
|
33
|
+
url_hash[:host] = splitted_url.first
|
34
|
+
url_hash[:path] = '/'
|
35
|
+
url_hash[:port] = splitted_url.last unless splitted_url.first == splitted_url.last
|
36
|
+
|
37
|
+
url_hash
|
38
|
+
end
|
39
|
+
|
40
|
+
def url_hash_for_url
|
41
|
+
Addressable::URI.parse(raw_url).to_hash
|
42
|
+
end
|
43
|
+
|
44
|
+
def url?(u)
|
45
|
+
url = Addressable::URI.parse(u)
|
46
|
+
|
47
|
+
return false if url.nil?
|
48
|
+
return false unless /\A[[:alnum:]]+\Z/ === url.scheme
|
49
|
+
return true if url && url.host
|
50
|
+
|
51
|
+
false
|
52
|
+
rescue Addressable::URI::InvalidURIError
|
53
|
+
false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# ProxyRb
|
3
|
+
module ProxyRb
|
4
|
+
# An HTTP request
|
5
|
+
class Request
|
6
|
+
protected
|
7
|
+
|
8
|
+
attr_reader :page
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def initialize(page)
|
13
|
+
@page = page
|
14
|
+
end
|
15
|
+
|
16
|
+
# Was the request successful
|
17
|
+
#
|
18
|
+
# @return [TrueClass, FalseClass]
|
19
|
+
# The result
|
20
|
+
def successful?
|
21
|
+
page.status_code.to_s.start_with?('2', '3')
|
22
|
+
end
|
23
|
+
|
24
|
+
# def forbidden?
|
25
|
+
# page.status_code == 403
|
26
|
+
# end
|
27
|
+
|
28
|
+
# def invalid?
|
29
|
+
# page.status_code == 401
|
30
|
+
# end
|
31
|
+
|
32
|
+
# def redirected?
|
33
|
+
# page.status_code.to_s.start_with? '3'
|
34
|
+
# end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'addressable/uri'
|
3
|
+
|
4
|
+
# ProxyRb
|
5
|
+
module ProxyRb
|
6
|
+
# A resource
|
7
|
+
class Resource
|
8
|
+
attr_accessor :content
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
attr_reader :url
|
13
|
+
|
14
|
+
public
|
15
|
+
|
16
|
+
def initialize(url)
|
17
|
+
@url = Addressable::URI.parse(url)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Convert resource to url
|
21
|
+
#
|
22
|
+
# @return [String] url
|
23
|
+
# The url
|
24
|
+
def to_url
|
25
|
+
url.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# ProxyRb
|
3
|
+
module ProxyRb
|
4
|
+
# A response
|
5
|
+
class Response
|
6
|
+
protected
|
7
|
+
|
8
|
+
attr_reader :page
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def initialize(page)
|
13
|
+
@page = page
|
14
|
+
end
|
15
|
+
|
16
|
+
# def forbidden?
|
17
|
+
# page.status_code == 403
|
18
|
+
# end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,11 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'capybara/poltergeist'
|
3
|
+
|
4
|
+
require 'proxy_rb'
|
5
|
+
require 'proxy_rb/resource'
|
6
|
+
require 'proxy_rb/http_downloader'
|
7
|
+
require 'proxy_rb/http_proxy'
|
8
|
+
require 'proxy_rb/request'
|
9
|
+
require 'proxy_rb/response'
|
10
|
+
|
1
11
|
# Main Module
|
2
12
|
module ProxyRb
|
3
13
|
# Main Module
|
4
14
|
module Rspec
|
5
15
|
# Helpers
|
6
16
|
module Helpers
|
17
|
+
# Non includable internal helper methods
|
18
|
+
#
|
19
|
+
# Not for use by normal users
|
20
|
+
module NonIncludes
|
21
|
+
class << self
|
22
|
+
def clear_environment
|
23
|
+
%w(
|
24
|
+
http_proxy
|
25
|
+
https_proxy
|
26
|
+
HTTP_PROXY
|
27
|
+
HTTPS_PROXY
|
28
|
+
).each { |v| ENV.delete v }
|
29
|
+
end
|
30
|
+
|
31
|
+
def register_capybara_driver_for_proxy(proxy)
|
32
|
+
options = {
|
33
|
+
phantomjs_options: proxy.to_phantom_js,
|
34
|
+
js_errors: false,
|
35
|
+
phantomjs_logger: $stderr
|
36
|
+
}
|
37
|
+
|
38
|
+
::Capybara.register_driver proxy.to_sym do |app|
|
39
|
+
::Capybara::Poltergeist::Driver.new(app, options)
|
40
|
+
end
|
41
|
+
|
42
|
+
::Capybara.run_server = false
|
43
|
+
::Capybara.current_driver = proxy.to_sym
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
7
48
|
# For http proxy
|
8
49
|
module HttpProxy
|
50
|
+
include ::Capybara::DSL
|
51
|
+
|
52
|
+
# The proxy based on subject
|
53
|
+
def proxy
|
54
|
+
ProxyRb::HttpProxy.new(ProxyUrlParser.new(subject))
|
55
|
+
end
|
56
|
+
|
57
|
+
# Visit an URL
|
58
|
+
#
|
59
|
+
# @param [String] url
|
60
|
+
def visit(url)
|
61
|
+
resource = Resource.new(url)
|
62
|
+
|
63
|
+
NonIncludes.clear_environment
|
64
|
+
NonIncludes.register_capybara_driver_for_proxy(proxy)
|
65
|
+
|
66
|
+
begin
|
67
|
+
super(resource.to_url)
|
68
|
+
rescue ::Capybara::Poltergeist::TimeoutError
|
69
|
+
raise ProxyRb::UrlTimeoutError, "Failed to fetch #{resource.to_url}: Timeout occured."
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# !@method download
|
74
|
+
#
|
75
|
+
# @see #visit
|
76
|
+
alias download visit
|
77
|
+
|
78
|
+
# Get access to the request made
|
79
|
+
def request
|
80
|
+
Request.new(page)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Get access to the response get
|
84
|
+
def response
|
85
|
+
Response.new(page)
|
86
|
+
end
|
9
87
|
end
|
10
88
|
end
|
11
89
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'contracts'
|
3
|
+
|
4
|
+
# ProxyRb
|
5
|
+
module ProxyRb
|
6
|
+
# Rspec
|
7
|
+
module Rspec
|
8
|
+
# Helpers
|
9
|
+
module Helpers
|
10
|
+
# Helpers to access passwords
|
11
|
+
module Passwords
|
12
|
+
include Contracts::Core
|
13
|
+
include Contracts::Builtin
|
14
|
+
|
15
|
+
Contract Or[String, Symbol] => Maybe[String]
|
16
|
+
# Get password for user
|
17
|
+
#
|
18
|
+
# @param [String] user_name
|
19
|
+
# The user name
|
20
|
+
#
|
21
|
+
# @return [String]
|
22
|
+
# The password
|
23
|
+
def password(user_name)
|
24
|
+
ProxyRb.config.password_fetcher.call(user_name.to_s)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/proxy_rb/rspec.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'rspec'
|
2
|
-
require 'capybara/poltergeist'
|
3
3
|
require 'capybara/rspec'
|
4
4
|
|
5
|
-
require 'proxy_rb
|
5
|
+
require 'proxy_rb'
|
6
|
+
require 'proxy_rb/no_proxy'
|
6
7
|
|
7
|
-
ProxyRb.
|
8
|
-
ProxyRb.
|
9
|
-
ProxyRb.
|
10
|
-
ProxyRb.
|
8
|
+
ProxyRb.require_files_matching_pattern('rspec/helpers/*.rb')
|
9
|
+
ProxyRb.require_files_matching_pattern('rspec/matchers/*.rb')
|
10
|
+
ProxyRb.require_files_matching_pattern('rspec/shared_examples/*.rb')
|
11
|
+
ProxyRb.require_files_matching_pattern('rspec/shared_contexts/*.rb')
|
11
12
|
|
12
13
|
# Main Module
|
13
14
|
module ProxyRb
|
@@ -18,4 +19,6 @@ end
|
|
18
19
|
|
19
20
|
RSpec.configure do |config|
|
20
21
|
config.include ProxyRb::Rspec::Helpers::HttpProxy, type: :http_proxy
|
22
|
+
config.include ProxyRb::Rspec::Helpers::Passwords, type: :http_proxy
|
23
|
+
config.include Capybara::RSpecMatchers, type: :http_proxy
|
21
24
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# ProxyRb
|
3
|
+
module ProxyRb
|
4
|
+
# User passwords
|
5
|
+
module UserPasswords
|
6
|
+
# Be a password from environment
|
7
|
+
class EnvironmentUserPassword
|
8
|
+
include Contracts::Core
|
9
|
+
include Contracts::Builtin
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
attr_reader :response
|
14
|
+
|
15
|
+
public
|
16
|
+
|
17
|
+
def initialize(response)
|
18
|
+
@response = response
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return password
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
Contract None => String
|
25
|
+
def to_s
|
26
|
+
response.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# ProxyRb
|
3
|
+
module ProxyRb
|
4
|
+
# User Passwords
|
5
|
+
module UserPasswords
|
6
|
+
# Be a password return from vault
|
7
|
+
class VaultUserPassword
|
8
|
+
include Contracts::Core
|
9
|
+
include Contracts::Builtin
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
attr_reader :response
|
14
|
+
|
15
|
+
public
|
16
|
+
|
17
|
+
def initialize(response)
|
18
|
+
@response = response.data
|
19
|
+
end
|
20
|
+
|
21
|
+
Contract None => String
|
22
|
+
def to_s
|
23
|
+
response[:password].to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/proxy_rb/version.rb
CHANGED
data/lib/proxy_rb.rb
CHANGED
data/proxy_rb.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'proxy_rb/version'
|
@@ -24,8 +25,9 @@ Gem::Specification.new do |spec|
|
|
24
25
|
spec.add_runtime_dependency 'poltergeist'
|
25
26
|
|
26
27
|
spec.add_runtime_dependency 'addressable'
|
27
|
-
spec.add_runtime_dependency '
|
28
|
-
spec.add_runtime_dependency '
|
28
|
+
spec.add_runtime_dependency 'contracts'
|
29
|
+
spec.add_runtime_dependency 'excon'
|
30
|
+
# spec.add_runtime_dependency 'phantomjs'
|
29
31
|
|
30
|
-
spec.required_ruby_version = '~> 2.
|
32
|
+
spec.required_ruby_version = '~> 2.3'
|
31
33
|
end
|