setsuzoku 0.11.0 → 0.11.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/lib/setsuzoku/api_strategy.rb +1 -1
- data/lib/setsuzoku/credential.rb +12 -0
- data/lib/setsuzoku/rspec/dynamic_spec_helper.rb +10 -7
- data/lib/setsuzoku/service/web_service/api_strategies/rest_strategy.rb +14 -9
- data/lib/setsuzoku/service/web_service/auth_strategies/o_auth_strategy.rb +21 -29
- data/lib/setsuzoku/service/web_service/credentials/basic_auth_credential.rb +2 -2
- data/lib/setsuzoku/service/web_service/credentials/o_auth_credential.rb +2 -2
- data/lib/setsuzoku/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd0ca4436f63ee80c7411553690acc0600a3556842acda30c580767de4d5fefe
|
4
|
+
data.tar.gz: 9cdf81df738bc16aef812b6cc5f68cb7e26b5a3a1666dcbf214a79ac16e22f28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 888f8ee20d1bc364d6a0b9ddd54ab2cdeb8c9e54078ea5bc36ef5193fac5d75ee7310492c55493fa4e6dae2975103b31e087ca6f23557bca2d52f22622d5a700
|
7
|
+
data.tar.gz: a07a89413cae6b20f159eec21cd37f90e73e80d8ee8b1d0522f5186b71aa587483145c29deaff231337a805fb5291ba3c45e17a364cab37e0123890982ffd218
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
setsuzoku (0.11.
|
4
|
+
setsuzoku (0.11.9)
|
5
5
|
activesupport (~> 5.0)
|
6
6
|
faraday (~> 0.11)
|
7
7
|
httparty (~> 0.16.4)
|
@@ -57,7 +57,7 @@ GEM
|
|
57
57
|
safe_yaml (1.0.5)
|
58
58
|
sorbet (0.5.5675)
|
59
59
|
sorbet-static (= 0.5.5675)
|
60
|
-
sorbet-runtime (0.5.
|
60
|
+
sorbet-runtime (0.5.5878)
|
61
61
|
sorbet-static (0.5.5675-universal-darwin-14)
|
62
62
|
thread_safe (0.3.6)
|
63
63
|
tzinfo (1.2.7)
|
@@ -80,7 +80,7 @@ module Setsuzoku
|
|
80
80
|
self.external_api_handler.call_external_api_wrapper(plugin: self.plugin, request: request, action_details: action_details) do
|
81
81
|
begin
|
82
82
|
# raise if the token is invalid and needs refreshed, but don't raise if we are trying to get a refresh token
|
83
|
-
raise Setsuzoku::Exception::InvalidAuthCredentials.new unless (
|
83
|
+
raise Setsuzoku::Exception::InvalidAuthCredentials.new unless (strategy == :auth || self.auth_strategy.auth_credential_valid?)
|
84
84
|
raw_response = self.perform_external_call(request: request, action_details: action_details, **options)
|
85
85
|
formatted_response = self.parse_response(response: raw_response, response_type: action_details[:actions][request.action][:response_type])
|
86
86
|
success = true
|
data/lib/setsuzoku/credential.rb
CHANGED
@@ -14,6 +14,18 @@ module Setsuzoku
|
|
14
14
|
sig { abstract.returns(Struct) }
|
15
15
|
def self.stub_credential; end
|
16
16
|
|
17
|
+
# The status of the credential.
|
18
|
+
#
|
19
|
+
# @return [Hash] the status of the credential.
|
20
|
+
sig { abstract.returns(String) }
|
21
|
+
def status; end
|
22
|
+
|
23
|
+
# Setter for the status of the credential.
|
24
|
+
#
|
25
|
+
# @return [Hash] the status of the credential.
|
26
|
+
sig { abstract.params(val: T.nilable(String)).returns(String) }
|
27
|
+
def status=(val); end
|
28
|
+
|
17
29
|
# A settings object for the credential.
|
18
30
|
#
|
19
31
|
# @return [Hash] the settings for the credential.
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'active_support/core_ext/class/subclasses'
|
4
4
|
require 'active_support/inflector/methods'
|
5
|
+
require 'faraday'
|
6
|
+
|
5
7
|
module Setsuzoku
|
6
8
|
module DynamicSpecHelper
|
7
9
|
|
@@ -150,20 +152,21 @@ module Setsuzoku
|
|
150
152
|
stub.each do |action_name, props|
|
151
153
|
props.each do |propz|
|
152
154
|
plugin.api_strategy.current_action = action_name
|
153
|
-
default_headers = plugin.api_strategy.request_options(propz[:request_format])[:headers] || { '
|
155
|
+
default_headers = plugin.api_strategy.request_options(propz[:request_format])[:headers] || { 'Content-Type' => "application/#{propz[:request_format]}" }
|
154
156
|
if plugin.auth_strategy.is_a?(Setsuzoku::Service::WebService::AuthStrategies::BasicAuthStrategy)
|
155
157
|
basic_auth = plugin.api_strategy.request_options(propz[:request_format])[:basic_auth]
|
156
158
|
auth_header = { 'Authorization' => "Basic #{Base64.encode64("#{basic_auth[:username]}:#{basic_auth[:password]}").gsub("\n", '')}" }
|
157
|
-
|
159
|
+
elsif plugin.auth_strategy.is_a?(Setsuzoku::Service::WebService::AuthStrategies::OAuthStrategy)
|
160
|
+
auth_header = { 'Authorization' => "Bearer #{plugin.api_strategy.request_options(propz[:request_format])[:token]}" }
|
158
161
|
end
|
162
|
+
default_headers.merge!(auth_header) if auth_header
|
159
163
|
headers = propz[:headers] ? [propz[:headers]] : [default_headers]
|
160
164
|
stub_directory ||= "#{plugin.class.plugin_namespace}/#{provider}"
|
165
|
+
|
161
166
|
headers.each do |header|
|
162
|
-
header =
|
163
|
-
|
164
|
-
|
165
|
-
'User-Agent'=>'Ruby'
|
166
|
-
}.merge(header.deep_stringify_keys)
|
167
|
+
header = Faraday.new.headers
|
168
|
+
.merge({'Accept'=>'*/*','Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3'})
|
169
|
+
.merge(header.deep_stringify_keys)
|
167
170
|
|
168
171
|
if propz[:stub_data]
|
169
172
|
# we have specified specific stub data for this action
|
@@ -33,7 +33,7 @@ module Setsuzoku
|
|
33
33
|
# media_type - 'json'
|
34
34
|
#
|
35
35
|
# @return [Hash] the parsed response object.
|
36
|
-
sig { override.params(request:
|
36
|
+
sig { override.params(request: RestAPIRequest, action_details: T::Hash[T.untyped, T.untyped], options: T.untyped).returns(Faraday::Response) }
|
37
37
|
def perform_external_call(request:, action_details:, **options)
|
38
38
|
request_properties = self.get_request_properties(action_name: request.action, action_details: action_details, req_params: request.body)
|
39
39
|
request_options = self.request_options(request_properties[:request_format], action_details[:actions][request.action])
|
@@ -43,11 +43,14 @@ module Setsuzoku
|
|
43
43
|
@faraday = Faraday.new(url: request_properties[:formatted_full_url], request: { params_encoder: Faraday::FlatParamsEncoder }) do |faraday|
|
44
44
|
faraday.request(:multipart) if options[:attachments].present?
|
45
45
|
faraday.request(:url_encoded)
|
46
|
-
# faraday.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
#TODO: change these to faraday = self.auth_strategy.set_authorization!(request: faraday)
|
47
|
+
unless request.without_headers
|
48
|
+
if request_options[:token]
|
49
|
+
faraday.authorization(:Bearer, request_options[:token])
|
50
|
+
elsif request_options[:basic_auth]
|
51
|
+
faraday.request(:basic_auth, request_options[:basic_auth][:username], request_options[:basic_auth][:password])
|
52
|
+
end
|
53
|
+
end
|
51
54
|
faraday.adapter Faraday.default_adapter
|
52
55
|
end
|
53
56
|
|
@@ -60,7 +63,11 @@ module Setsuzoku
|
|
60
63
|
req.body = payload
|
61
64
|
end
|
62
65
|
else
|
63
|
-
|
66
|
+
if request.without_headers
|
67
|
+
@faraday.headers = {}
|
68
|
+
elsif request_options[:headers]
|
69
|
+
@faraday.headers = (@faraday.headers || {}).merge(request_options[:headers])
|
70
|
+
end
|
64
71
|
resp = @faraday.send(request_properties[:request_method], request_properties[:formatted_full_url], full_request)
|
65
72
|
end
|
66
73
|
resp
|
@@ -81,7 +88,6 @@ module Setsuzoku
|
|
81
88
|
request_method = request_method.downcase.to_sym
|
82
89
|
request_format = action[:request_type]
|
83
90
|
response_format = action[:response_type]
|
84
|
-
token = action[:token]
|
85
91
|
stub_data = action[:stub_data] if for_stub
|
86
92
|
full_url = url + endpoint
|
87
93
|
formatted_full_url, req_params = self.replace_dynamic_vars(full_url: full_url, req_params: req_params)
|
@@ -93,7 +99,6 @@ module Setsuzoku
|
|
93
99
|
formatted_full_url: formatted_full_url,
|
94
100
|
req_params: req_params,
|
95
101
|
stub_data: stub_data,
|
96
|
-
token: token
|
97
102
|
}
|
98
103
|
end
|
99
104
|
|
@@ -31,9 +31,7 @@ module Setsuzoku
|
|
31
31
|
sig { override.returns(T::Hash[Symbol, T.untyped]) }
|
32
32
|
def auth_headers
|
33
33
|
{
|
34
|
-
|
35
|
-
'Authorization': "Bearer #{self.credential.token}"
|
36
|
-
}
|
34
|
+
token: self.credential.token
|
37
35
|
}
|
38
36
|
end
|
39
37
|
|
@@ -73,7 +71,7 @@ module Setsuzoku
|
|
73
71
|
# @return [Boolean] true if the token is invalid.
|
74
72
|
sig { returns(T::Boolean) }
|
75
73
|
def token_is_invalid?
|
76
|
-
active = self.credential.
|
74
|
+
active = self.credential.status != 'disabled'
|
77
75
|
active && !self.credential.expires_on.blank? &&
|
78
76
|
!self.credential.refresh_token.blank? &&
|
79
77
|
(self.credential.expires_on < refresh_before_expiration_time)
|
@@ -112,38 +110,32 @@ module Setsuzoku
|
|
112
110
|
sig { params(body: T::Hash[Symbol, String], action: Symbol).void }
|
113
111
|
def get_token!(body, action)
|
114
112
|
success = false
|
115
|
-
request = self.api_strategy.request_class.new(action: action, body: body)
|
113
|
+
request = self.api_strategy.request_class.new(action: action, body: body, without_headers: true)
|
116
114
|
|
117
115
|
resp = self.api_strategy.call_external_api(request: request, strategy: :auth)
|
118
116
|
|
117
|
+
attrs = {}
|
119
118
|
if resp.data && resp.data[:access_token]
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
self.plugin.set_credential_fields!(resp) if self.plugin.respond_to?(:set_credential_fields!)
|
130
|
-
|
131
|
-
#TODO: figure out a better way to do this when we add other integrations...
|
132
|
-
#
|
133
|
-
# if self.is_a?(FacebookIntegration)
|
134
|
-
# resp = self.exchange_for_long_lived_token
|
135
|
-
# if resp && resp.data['access_token']
|
136
|
-
# self.token = resp.data['access_token']
|
137
|
-
# self.refresh_token = resp.data['access_token']
|
138
|
-
# self.expires_on = 59.days.from_now
|
139
|
-
# end
|
140
|
-
# end
|
119
|
+
attrs[:status] = 'active'
|
120
|
+
attrs[:token] = resp.data[:access_token]
|
121
|
+
attrs[:refresh_token] = resp.data[:refresh_token] if resp.data.key?(:refresh_token)
|
122
|
+
attrs[:expires_on] = resp.data[:expires_in].to_i.seconds.from_now if resp.data[:expires_in]
|
123
|
+
|
124
|
+
plugin_attrs = self.plugin.credential_fields_to_update(resp) if self.plugin.respond_to?(:credential_fields_to_update)
|
125
|
+
attrs.merge!(plugin_attrs)
|
141
126
|
else
|
142
|
-
|
127
|
+
attrs[:status] = 'error'
|
143
128
|
end
|
144
129
|
|
145
|
-
|
146
|
-
|
130
|
+
# Only save Setsuzoku known fields, and any additional attributes the plugin specifies
|
131
|
+
# in credential_fields_to_update.
|
132
|
+
if self.credential.respond_to?(:"update_columns")
|
133
|
+
# we issue an update_columns instead of a save/update_attributes
|
134
|
+
# so as to only mutate these attributes
|
135
|
+
# and not any other fields that may have been set for the credential
|
136
|
+
save = self.credential.update_columns(attrs)
|
137
|
+
self.credential.touch if save && self.credential.respond_to?(:"touch")
|
138
|
+
save && resp.success
|
147
139
|
else
|
148
140
|
resp.success
|
149
141
|
end
|
@@ -42,8 +42,8 @@ module Setsuzoku
|
|
42
42
|
# @return [Struct] a stubbed basic_auth_credential-like struct.
|
43
43
|
sig { returns(Struct) }
|
44
44
|
def self.stub_credential
|
45
|
-
s = Struct.new(:username, :password)
|
46
|
-
s.new('stubbed_username', 'stubbed_password')
|
45
|
+
s = Struct.new(:status, :settings, :username, :password)
|
46
|
+
s.new('active', {}, 'stubbed_username', 'stubbed_password')
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -73,8 +73,8 @@ module Setsuzoku
|
|
73
73
|
# @return [Struct] a stubbed o_auth_credential-like struct.
|
74
74
|
sig { returns(Struct) }
|
75
75
|
def self.stub_credential
|
76
|
-
s = Struct.new(:client_id, :client_secret, :redirect_url, :token, :refresh_token, :expires_on
|
77
|
-
s.new('stubbed_client_id', 'stubbed_client_secret', 'stubbed_redirect_url', 'stubbed_token', 'refresh_token', (Time.now + 30.days)
|
76
|
+
s = Struct.new(:status, :settings, :client_id, :client_secret, :redirect_url, :token, :refresh_token, :expires_on)
|
77
|
+
s.new('active', {'extension': 'test'}, 'stubbed_client_id', 'stubbed_client_secret', 'stubbed_redirect_url', 'stubbed_token', 'refresh_token', (Time.now + 30.days))
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
data/lib/setsuzoku/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: setsuzoku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Stadtler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|