finapps 2.0.24 → 2.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 459e76ea87b8115a6832116c5fa5244f5074694c
4
- data.tar.gz: 0ebb05734404029ce95eb67a6ce7b893c2b7435d
3
+ metadata.gz: dc5c86dcbace8459aab80bd8bdeb80944243b4f3
4
+ data.tar.gz: 3522a70ae623fa2956b06d5c9324dd1bca9dd9ac
5
5
  SHA512:
6
- metadata.gz: 56509e050cfa3f90fd8575bd28c2dd758d7beded369f8f272fd4f181c55cabfcba09a58fe767ff0ac73e3cb5ec6de2ce44e747749e9ecbfd1914917dcef41962
7
- data.tar.gz: 49b53717825e7c597409f7609f050e6430f10d9ff6bdcda025212409d3afba9f957ed339055915e2c9a2c4a3acd3bf15820c989b140c927bf1155043c598077c
6
+ metadata.gz: fa70bf1edce8053dbe6f51a1616852b984179ff058a2bfb59fa5fbf6ec3339a082860968072fcd5b834b6ef7fda572359aabaca94b9a7daa83686e669d4833c2
7
+ data.tar.gz: 4406b0fd8ef1fa2e9ef0ef08b2216ecd4206f3a1ce710e0e5a9af3afb042773978f48f752d68c073299a9caf4e83e90092adb1d66c9fff4507b1d7b807efccae
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module StringExtensions
3
+ refine String do
4
+ def json_to_hash
5
+ ::JSON.parse(self)
6
+ rescue ::JSON::ParserError
7
+ # logger.error "##{__method__} => Unable to parse JSON response."
8
+ end
9
+ end
10
+ end
@@ -6,12 +6,15 @@ module FinApps
6
6
  autoload :AcceptJson, 'finapps/middleware/request/accept_json'
7
7
  autoload :UserAgent, 'finapps/middleware/request/user_agent'
8
8
  autoload :TenantAuthentication, 'finapps/middleware/request/tenant_authentication'
9
+ autoload :CustomLogger, 'finapps/middleware/response/custom_logger'
9
10
 
10
11
  if Faraday::Middleware.respond_to? :register_middleware
11
12
  Faraday::Request.register_middleware \
12
13
  accept_json: -> { AcceptJson },
13
14
  user_agent: -> { UserAgent },
14
15
  tenant_authentication: -> { TenantAuthentication }
16
+ Faraday::Response.register_middleware \
17
+ custom_logger: -> { CustomLogger }
15
18
  end
16
19
  end
17
20
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ module FinApps
3
+ module Middleware
4
+ class CustomLogger < Faraday::Response::Middleware
5
+ extend Forwardable
6
+ include FinApps::Utils::ParameterFilter
7
+
8
+ DEFAULT_OPTIONS = {bodies: false}.freeze
9
+
10
+ def initialize(app, logger=nil, options={})
11
+ super(app)
12
+ @logger = logger || begin
13
+ require 'logger'
14
+ ::Logger.new(STDOUT)
15
+ end
16
+ @options = DEFAULT_OPTIONS.merge(options)
17
+ end
18
+
19
+ def_delegators :@logger, :debug, :info, :warn, :error, :fatal
20
+
21
+ def call(env)
22
+ info "##{__method__} => ##{env.method} #{env.url}"
23
+ debug "##{__method__} => Request Headers: #{dump_headers env.request_headers}"
24
+
25
+ super
26
+ end
27
+
28
+ def on_complete(env)
29
+ info "##{__method__} => ##{env.method} #{env.url}"
30
+ debug "##{__method__} => Response Headers: #{dump_headers env.response_headers}"
31
+ info "##{__method__} => Response Body: #{dump_body env.body}" if env.body
32
+ end
33
+
34
+ private
35
+
36
+ def dump_headers(headers)
37
+ headers.map {|k, v| " #{k}: #{filter_sensitive_header_values(k, v)}" }.to_s
38
+ end
39
+
40
+ def filter_sensitive_header_values(key, value)
41
+ case key
42
+ when 'X-FinApps-Token', 'Authorization'
43
+ '[REDACTED]'
44
+ else
45
+ value.inspect
46
+ end
47
+ end
48
+
49
+ def dump_body(body)
50
+ skip_sensitive_data(body)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -31,19 +31,13 @@ module FinApps
31
31
 
32
32
  def error_messages(body)
33
33
  return nil if body.blank?
34
- body = parse_string(body) if body.is_a?(String)
34
+ body = body.json_to_hash if body.is_a?(String)
35
35
  has_message_key?(body) ? body['messages'] : nil
36
36
  end
37
37
 
38
38
  def has_message_key?(body)
39
39
  body.respond_to?(:key?) && body.key?('messages')
40
40
  end
41
-
42
- def parse_string(body)
43
- ::JSON.parse(body)
44
- rescue ::JSON::ParserError
45
- # logger.error "##{__method__} => Unable to parse JSON response."
46
- end
47
41
  end
48
42
  end
49
43
  end
@@ -23,7 +23,7 @@ module FinApps
23
23
  conn.use FinApps::Middleware::RaiseError
24
24
  conn.response :rashify
25
25
  conn.response :json, content_type: /\bjson$/
26
- conn.response :logger, logger, bodies: (ENV['SILENT_LOG_BODIES'] != 'true')
26
+ conn.response :custom_logger, logger, bodies: (ENV['SILENT_LOG_BODIES'] != 'true')
27
27
 
28
28
  # Adapter (ensure that the adapter is always last.)
29
29
  conn.adapter :typhoeus
@@ -2,6 +2,7 @@
2
2
  module FinApps
3
3
  module REST
4
4
  class Resources # :nodoc:
5
+ include FinApps::Utils::ParameterFilter
5
6
  require 'erb'
6
7
 
7
8
  attr_reader :client
@@ -44,7 +45,7 @@ module FinApps
44
45
 
45
46
  def request_with_body(path, method, params)
46
47
  path = end_point if path.nil?
47
- logger.debug "#{self.class.name}##{__method__} => path: #{path} params: #{params}"
48
+ logger.debug "#{self.class.name}##{__method__} => path: #{path} params: #{skip_sensitive_data(params)}"
48
49
 
49
50
  client.send_request path, method, params
50
51
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+ module FinApps
3
+ module Utils
4
+ module ParameterFilter
5
+ using StringExtensions
6
+ PROTECTED_KEYS = %w(login login1 username password password1 password_confirm token).freeze
7
+
8
+ def skip_sensitive_data(hash)
9
+ if hash.is_a? String
10
+ hash = hash.json_to_hash
11
+ end
12
+ if hash.is_a? Hash
13
+ filtered_hash = hash.clone
14
+ filtered_hash.each do |key, value|
15
+ if PROTECTED_KEYS.include? key.to_s.downcase
16
+ filtered_hash[key] = '[REDACTED]'
17
+ elsif value.is_a?(Hash)
18
+ filtered_hash[key] = skip_sensitive_data(value)
19
+ elsif value.is_a?(Array)
20
+ filtered_hash[key] = value.map {|v| v.is_a?(Hash) ? skip_sensitive_data(v) : v }
21
+ end
22
+ end
23
+
24
+ filtered_hash
25
+ else
26
+ hash
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module FinApps
3
- VERSION = '2.0.24'
3
+ VERSION = '2.0.25'
4
4
  end
data/lib/finapps.rb CHANGED
@@ -9,7 +9,10 @@ require 'typhoeus/adapters/faraday'
9
9
  require 'core_extensions/hash/compact'
10
10
  require 'core_extensions/object/blank'
11
11
  require 'core_extensions/object/is_integer'
12
+ require 'core_extensions/string/json_to_hash'
13
+
12
14
  require 'finapps/utils/loggeable'
15
+ require 'finapps/utils/parameter_filter'
13
16
  require 'finapps/error'
14
17
 
15
18
  require 'finapps/middleware/request/tenant_authentication'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ class FakeClass
3
+ include ::FinApps::Utils::ParameterFilter
4
+ end
5
+
6
+ RSpec.describe FinApps::Utils::ParameterFilter do
7
+ describe '#skip_sensitive_data' do
8
+ context 'when provided with sensitive data' do
9
+ let(:unfiltered_params) do
10
+ {password: 'FinApps@123', password_confirm: 'FinApps@123', token: '123456',
11
+ login: 'sammysosa', username: 'johnny', name: 'george'}
12
+ end
13
+ let(:filtered_params) do
14
+ {password: '[REDACTED]', password_confirm: '[REDACTED]', token: '[REDACTED]',
15
+ login: '[REDACTED]', username: '[REDACTED]', name: 'george'}
16
+ end
17
+
18
+ it 'filters out sensitive values' do
19
+ expect(FakeClass.new.skip_sensitive_data(unfiltered_params)).to eq(filtered_params)
20
+ end
21
+ end
22
+ end
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finapps
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.24
4
+ version: 2.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erich Quintero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-25 00:00:00.000000000 Z
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -249,12 +249,14 @@ files:
249
249
  - lib/core_extensions/hash/compact.rb
250
250
  - lib/core_extensions/object/blank.rb
251
251
  - lib/core_extensions/object/is_integer.rb
252
+ - lib/core_extensions/string/json_to_hash.rb
252
253
  - lib/finapps.rb
253
254
  - lib/finapps/error.rb
254
255
  - lib/finapps/middleware/middleware.rb
255
256
  - lib/finapps/middleware/request/accept_json.rb
256
257
  - lib/finapps/middleware/request/tenant_authentication.rb
257
258
  - lib/finapps/middleware/request/user_agent.rb
259
+ - lib/finapps/middleware/response/custom_logger.rb
258
260
  - lib/finapps/middleware/response/raise_error.rb
259
261
  - lib/finapps/rest/base_client.rb
260
262
  - lib/finapps/rest/client.rb
@@ -273,6 +275,7 @@ files:
273
275
  - lib/finapps/rest/user_institutions_statuses.rb
274
276
  - lib/finapps/rest/users.rb
275
277
  - lib/finapps/utils/loggeable.rb
278
+ - lib/finapps/utils/parameter_filter.rb
276
279
  - lib/finapps/version.rb
277
280
  - lib/tasks/releaser.rake
278
281
  - spec/core_extensions/hash/compact_spec.rb
@@ -318,6 +321,7 @@ files:
318
321
  - spec/support/fixtures/user_institution_status.json
319
322
  - spec/support/fixtures/user_institutions_list.json
320
323
  - spec/support/fixtures/user_institutions_show.json
324
+ - spec/utils/parameter_filter_spec.rb
321
325
  homepage: https://github.com/finapps/ruby-client
322
326
  licenses:
323
327
  - MIT
@@ -356,6 +360,7 @@ test_files:
356
360
  - spec/middleware/response/raise_error_spec.rb
357
361
  - spec/core_extensions/hash/compact_spec.rb
358
362
  - spec/core_extensions/object/is_integer_spec.rb
363
+ - spec/utils/parameter_filter_spec.rb
359
364
  - spec/spec_helpers/client.rb
360
365
  - spec/spec_helper.rb
361
366
  - spec/rest/credentials_spec.rb