finapps 2.0.24 → 2.0.25

Sign up to get free protection for your applications and to get access to all the features.
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