securenative 0.1.27 → 0.1.32

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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/README.md +44 -30
  4. data/lib/securenative.rb +49 -0
  5. data/lib/securenative/api_manager.rb +10 -17
  6. data/lib/securenative/client.rb +79 -0
  7. data/lib/securenative/{models/client_token.rb → client_token.rb} +0 -0
  8. data/lib/securenative/config/configuration_builder.rb +22 -22
  9. data/lib/securenative/config/configuration_manager.rb +42 -43
  10. data/lib/securenative/context.rb +65 -0
  11. data/lib/securenative/{models/device.rb → device.rb} +0 -0
  12. data/lib/securenative/enums/api_route.rb +5 -3
  13. data/lib/securenative/enums/risk_level.rb +7 -5
  14. data/{out/production/securenative-ruby/errors/securenative_config_error.rb → lib/securenative/errors/config_error.rb} +0 -0
  15. data/{out/production/securenative-ruby/errors/securenative_http_error.rb → lib/securenative/errors/http_error.rb} +0 -0
  16. data/{out/production/securenative-ruby/errors/securenative_invalid_options_error.rb → lib/securenative/errors/invalid_options_error.rb} +0 -0
  17. data/lib/securenative/errors/{securenative_invalid_uri_error.rb → invalid_uri_error.rb} +0 -0
  18. data/lib/securenative/errors/{securenative_parse_error.rb → parse_error.rb} +0 -2
  19. data/{out/production/securenative-ruby/errors/securenative_sdk_Illegal_state_error.rb → lib/securenative/errors/sdk_Illegal_state_error.rb} +0 -0
  20. data/{out/production/securenative-ruby/errors/securenative_sdk_error.rb → lib/securenative/errors/sdk_error.rb} +0 -0
  21. data/lib/securenative/event_manager.rb +125 -128
  22. data/lib/securenative/{models/event_options.rb → event_options.rb} +3 -7
  23. data/lib/securenative/{enums/event_types.rb → event_types.rb} +0 -0
  24. data/lib/securenative/{enums/failover_strategy.rb → failover_strategy.rb} +0 -0
  25. data/lib/securenative/frameworks/hanami.rb +46 -0
  26. data/lib/securenative/frameworks/rails.rb +48 -0
  27. data/lib/securenative/frameworks/sinatra.rb +46 -0
  28. data/lib/securenative/{http/securenative_http_client.rb → http_client.rb} +7 -12
  29. data/lib/securenative/{http/secure_native_http_response.rb → http_response.rb} +1 -1
  30. data/lib/securenative/{config/securenative_options.rb → options.rb} +1 -3
  31. data/lib/securenative/{models/request_context.rb → request_context.rb} +0 -0
  32. data/lib/securenative/{models/request_options.rb → request_options.rb} +0 -0
  33. data/lib/securenative/{models/sdk_event.rb → sdk_event.rb} +4 -11
  34. data/lib/securenative/{models/user_traits.rb → user_traits.rb} +0 -0
  35. data/lib/securenative/utils/date_utils.rb +6 -4
  36. data/lib/securenative/utils/encryption_utils.rb +34 -37
  37. data/lib/securenative/utils/ip_utils.rb +15 -15
  38. data/lib/securenative/utils/{secure_native_logger.rb → log.rb} +1 -1
  39. data/lib/securenative/utils/request_utils.rb +66 -47
  40. data/lib/securenative/utils/signature_utils.rb +12 -12
  41. data/lib/securenative/utils/utils.rb +6 -4
  42. data/lib/securenative/utils/version_utils.rb +9 -7
  43. data/lib/securenative/{models/verify_result.rb → verify_result.rb} +0 -0
  44. data/lib/securenative/{errors/securenative_sdk_error.rb → version.rb} +1 -2
  45. data/securenative.gemspec +5 -2
  46. data/{out/test/securenative-ruby → spec}/spec_helper.rb +0 -0
  47. metadata +35 -83
  48. data/lib/securenative/context/hanami_context.rb +0 -44
  49. data/lib/securenative/context/rails_context.rb +0 -46
  50. data/lib/securenative/context/securenative_context.rb +0 -69
  51. data/lib/securenative/context/sinatra_context.rb +0 -44
  52. data/lib/securenative/errors/securenative_config_error.rb +0 -6
  53. data/lib/securenative/errors/securenative_http_error.rb +0 -6
  54. data/lib/securenative/errors/securenative_invalid_options_error.rb +0 -6
  55. data/lib/securenative/errors/securenative_sdk_Illegal_state_error.rb +0 -6
  56. data/lib/securenative/sdk.rb +0 -85
  57. data/out/production/securenative-ruby/api_manager.rb +0 -39
  58. data/out/production/securenative-ruby/config/configuration_builder.rb +0 -27
  59. data/out/production/securenative-ruby/config/configuration_manager.rb +0 -56
  60. data/out/production/securenative-ruby/config/securenative_options.rb +0 -23
  61. data/out/production/securenative-ruby/context/hanami_context.rb +0 -42
  62. data/out/production/securenative-ruby/context/rails_context.rb +0 -44
  63. data/out/production/securenative-ruby/context/securenative_context.rb +0 -67
  64. data/out/production/securenative-ruby/context/sinatra_context.rb +0 -42
  65. data/out/production/securenative-ruby/enums/api_route.rb +0 -6
  66. data/out/production/securenative-ruby/enums/event_types.rb +0 -23
  67. data/out/production/securenative-ruby/enums/failover_strategy.rb +0 -6
  68. data/out/production/securenative-ruby/enums/risk_level.rb +0 -7
  69. data/out/production/securenative-ruby/errors/securenative_invalid_uri_error.rb +0 -4
  70. data/out/production/securenative-ruby/errors/securenative_parse_error.rb +0 -4
  71. data/out/production/securenative-ruby/event_manager.rb +0 -157
  72. data/out/production/securenative-ruby/http/secure_native_http_response.rb +0 -12
  73. data/out/production/securenative-ruby/http/securenative_http_client.rb +0 -50
  74. data/out/production/securenative-ruby/models/client_token.rb +0 -12
  75. data/out/production/securenative-ruby/models/device.rb +0 -10
  76. data/out/production/securenative-ruby/models/event_options.rb +0 -37
  77. data/out/production/securenative-ruby/models/request_context.rb +0 -18
  78. data/out/production/securenative-ruby/models/request_options.rb +0 -12
  79. data/out/production/securenative-ruby/models/sdk_event.rb +0 -49
  80. data/out/production/securenative-ruby/models/user_traits.rb +0 -13
  81. data/out/production/securenative-ruby/models/verify_result.rb +0 -16
  82. data/out/production/securenative-ruby/securenative.rb +0 -83
  83. data/out/production/securenative-ruby/utils/date_utils.rb +0 -9
  84. data/out/production/securenative-ruby/utils/encryption_utils.rb +0 -49
  85. data/out/production/securenative-ruby/utils/ip_utils.rb +0 -23
  86. data/out/production/securenative-ruby/utils/request_utils.rb +0 -69
  87. data/out/production/securenative-ruby/utils/secure_native_logger.rb +0 -44
  88. data/out/production/securenative-ruby/utils/signature_utils.rb +0 -16
  89. data/out/production/securenative-ruby/utils/utils.rb +0 -9
  90. data/out/production/securenative-ruby/utils/version_utils.rb +0 -11
  91. data/out/test/securenative-ruby/spec_api_manager.rb +0 -87
  92. data/out/test/securenative-ruby/spec_context_builder.rb +0 -87
  93. data/out/test/securenative-ruby/spec_date_utils.rb +0 -13
  94. data/out/test/securenative-ruby/spec_encryption_utils.rb +0 -26
  95. data/out/test/securenative-ruby/spec_event_manager.rb +0 -93
  96. data/out/test/securenative-ruby/spec_ip_utils.rb +0 -41
  97. data/out/test/securenative-ruby/spec_request_utils.rb +0 -25
  98. data/out/test/securenative-ruby/spec_sdk_event.rb +0 -24
  99. data/out/test/securenative-ruby/spec_securenative.rb +0 -61
  100. data/out/test/securenative-ruby/spec_securenative_http_client.rb +0 -31
  101. data/out/test/securenative-ruby/spec_signature_utils.rb +0 -18
  102. data/out/test/securenative-ruby/spec_version_util.rb +0 -10
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Frameworks
5
+ class Rails
6
+ SECURENATIVE_COOKIE = '_sn'
7
+
8
+ def self.get_client_token(request)
9
+ begin
10
+ request.cookies[SECURENATIVE_COOKIE]
11
+ rescue StandardError
12
+ nil
13
+ end
14
+ end
15
+
16
+ def self.get_url(request)
17
+ begin
18
+ # Rails >= 3.x
19
+ request.fullpath
20
+ rescue StandardError
21
+ begin
22
+ # Rails < 3.x & Sinatra
23
+ request.url if url.nil?
24
+ rescue StandardError
25
+ nil
26
+ end
27
+ end
28
+ end
29
+
30
+ def self.get_method(request)
31
+ begin
32
+ request.method
33
+ rescue StandardError
34
+ nil
35
+ end
36
+ end
37
+
38
+ def self.get_headers(request)
39
+ begin
40
+ # Note: At the moment we're filtering out everything but user-agent since ruby's payload is way too big
41
+ {'user-agent' => request.env['HTTP_USER_AGENT']}
42
+ rescue StandardError
43
+ nil
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Frameworks
5
+ class Sinatra
6
+ SECURENATIVE_COOKIE = '_sn'
7
+
8
+ def self.get_client_token(request)
9
+ begin
10
+ request.env[SECURENATIVE_COOKIE]
11
+ rescue StandardError
12
+ begin
13
+ request.cookies[SECURENATIVE_COOKIE]
14
+ rescue StandardError
15
+ nil
16
+ end
17
+ end
18
+ end
19
+
20
+ def self.get_url(request)
21
+ begin
22
+ request.env['REQUEST_URI']
23
+ rescue StandardError
24
+ nil
25
+ end
26
+ end
27
+
28
+ def self.get_method(request)
29
+ begin
30
+ request.env['REQUEST_METHOD']
31
+ rescue StandardError
32
+ nil
33
+ end
34
+ end
35
+
36
+ def self.get_headers(request)
37
+ begin
38
+ # Note: At the moment we're filtering out everything but user-agent since ruby's payload is way too big
39
+ {'user-agent' => request.env['HTTP_USER_AGENT']}
40
+ rescue StandardError
41
+ nil
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,13 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'net/http'
4
- require 'uri'
5
- require 'json'
6
- require 'securenative/utils/version_utils'
7
- require 'securenative/utils/secure_native_logger'
8
-
9
3
  module SecureNative
10
- class SecureNativeHttpClient
4
+ class HttpClient
11
5
  AUTHORIZATION_HEADER = 'Authorization'
12
6
  VERSION_HEADER = 'SN-Version'
13
7
  USER_AGENT_HEADER = 'User-Agent'
@@ -21,10 +15,10 @@ module SecureNative
21
15
 
22
16
  def _headers
23
17
  {
24
- CONTENT_TYPE_HEADER => CONTENT_TYPE_HEADER_VALUE,
25
- USER_AGENT_HEADER => USER_AGENT_HEADER_VALUE,
26
- VERSION_HEADER => VersionUtils.version,
27
- AUTHORIZATION_HEADER => @options.api_key
18
+ CONTENT_TYPE_HEADER => CONTENT_TYPE_HEADER_VALUE,
19
+ USER_AGENT_HEADER => USER_AGENT_HEADER_VALUE,
20
+ VERSION_HEADER => SecureNative::Utils::VersionUtils.version,
21
+ AUTHORIZATION_HEADER => @options.api_key
28
22
  }
29
23
  end
30
24
 
@@ -33,6 +27,7 @@ module SecureNative
33
27
  headers = _headers
34
28
 
35
29
  client = Net::HTTP.new(uri.host, uri.port)
30
+ client.read_timeout = @options.timeout
36
31
  client.use_ssl = true
37
32
  client.verify_mode = OpenSSL::SSL::VERIFY_NONE
38
33
 
@@ -43,7 +38,7 @@ module SecureNative
43
38
  begin
44
39
  res = client.request(request)
45
40
  rescue StandardError => e
46
- SecureNativeLogger.error("Failed to send request; #{e}")
41
+ SecureNative::Log.error("Failed to send request; #{e}")
47
42
  return res
48
43
  end
49
44
  res
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SecureNative
4
- class SecureNativeHttpResponse
4
+ class HttpResponse
5
5
  attr_reader :ok, :status_code, :body
6
6
  attr_writer :ok, :status_code, :body
7
7
 
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'securenative/enums/failover_strategy'
4
-
5
3
  module SecureNative
6
- class SecureNativeOptions
4
+ class Options
7
5
  attr_reader :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
8
6
  attr_writer :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
9
7
 
@@ -1,12 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'securenative/context/securenative_context'
4
- require 'securenative/errors/securenative_invalid_options_error'
5
- require 'securenative/utils/encryption_utils'
6
- require 'securenative/utils/date_utils'
7
- require 'securenative/models/request_context'
8
- require 'securerandom'
9
-
10
3
  module SecureNative
11
4
  class SDKEvent
12
5
  attr_reader :context, :rid, :event_type, :user_id, :user_traits, :request, :timestamp, :properties
@@ -24,10 +17,10 @@ module SecureNative
24
17
  @context = if !event_options.context.nil?
25
18
  event_options.context
26
19
  else
27
- SecureNativeContext.default_context_builder
20
+ Context.default_context_builder
28
21
  end
29
22
 
30
- client_token = EncryptionUtils.decrypt(@context.client_token, securenative_options.api_key)
23
+ client_token = SecureNative::Utils::EncryptionUtils.decrypt(@context.client_token, securenative_options.api_key)
31
24
 
32
25
  @rid = SecureRandom.uuid.to_str
33
26
  @event_type = event_options.event
@@ -39,12 +32,12 @@ module SecureNative
39
32
  url: @context.url, http_method: @context.http_method)
40
33
 
41
34
 
42
- @timestamp = DateUtils.to_timestamp(event_options.timestamp)
35
+ @timestamp = SecureNative::Utils::DateUtils.to_timestamp(event_options.timestamp)
43
36
  @properties = event_options.properties
44
37
  end
45
38
 
46
39
  def to_s
47
- "securenative.context: #{@context}, rid: #{@rid}, event_type: #{@event_type}, user_id: #{@user_id},
40
+ "context: #{@context}, rid: #{@rid}, event_type: #{@event_type}, user_id: #{@user_id},
48
41
  user_traits: #{@user_traits}, request: #{@request}, timestamp: #{@timestamp}, properties: #{@properties}"
49
42
  end
50
43
  end
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SecureNative
4
- class DateUtils
5
- def self.to_timestamp(date)
6
- return Time.now.utc.iso8601 if date.nil?
4
+ module Utils
5
+ class DateUtils
6
+ def self.to_timestamp(date)
7
+ return Time.now.utc.iso8601 if date.nil?
7
8
 
8
- Time.parse(date).iso8601
9
+ Time.parse(date).iso8601
10
+ end
9
11
  end
10
12
  end
11
13
  end
@@ -1,50 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'openssl'
4
- require 'digest'
5
- require 'base64'
6
- require 'securenative/models/client_token'
7
-
8
3
  module SecureNative
9
- class EncryptionUtils
10
- def self.padding_key(key, length)
11
- if key.length == length
12
- key
13
- else
14
- if key.length > length
15
- key.slice(0, length)
16
- else
17
- (length - key.length).times { key << '0' }
4
+ module Utils
5
+ class EncryptionUtils
6
+ def self.padding_key(key, length)
7
+ if key.length == length
18
8
  key
9
+ else
10
+ if key.length > length
11
+ key.slice(0, length)
12
+ else
13
+ (length - key.length).times { key << '0' }
14
+ key
15
+ end
19
16
  end
20
17
  end
21
- end
22
18
 
23
- def self.encrypt(plain_text, secret_key)
24
- begin
25
- cipher = OpenSSL::Cipher.new('aes-256-cbc')
26
- cipher.encrypt
27
- iv = cipher.random_iv
28
- cipher.key = padding_key(secret_key, 32)
29
- encrypted = cipher.update(plain_text) + cipher.final
30
- (iv + encrypted).unpack1('H*')
31
- rescue StandardError
32
- ''
19
+ def self.encrypt(plain_text, secret_key)
20
+ begin
21
+ cipher = OpenSSL::Cipher.new('aes-256-cbc')
22
+ cipher.encrypt
23
+ iv = cipher.random_iv
24
+ cipher.key = padding_key(secret_key, 32)
25
+ encrypted = cipher.update(plain_text) + cipher.final
26
+ (iv + encrypted).unpack1('H*')
27
+ rescue StandardError
28
+ ''
29
+ end
33
30
  end
34
- end
35
31
 
36
- def self.decrypt(cipher_text, secret_key)
37
- begin
38
- cipher = OpenSSL::Cipher.new('aes-256-cbc')
39
- cipher.decrypt
40
- raw_data = [cipher_text].pack('H*')
41
- cipher.iv = raw_data.slice(0, 16)
42
- cipher.key = padding_key(secret_key, 32)
43
- decrypted = JSON.parse(cipher.update(raw_data.slice(16, raw_data.length)) + cipher.final)
32
+ def self.decrypt(cipher_text, secret_key)
33
+ begin
34
+ cipher = OpenSSL::Cipher.new('aes-256-cbc')
35
+ cipher.decrypt
36
+ raw_data = [cipher_text].pack('H*')
37
+ cipher.iv = raw_data.slice(0, 16)
38
+ cipher.key = padding_key(secret_key, 32)
39
+ decrypted = JSON.parse(cipher.update(raw_data.slice(16, raw_data.length)) + cipher.final)
44
40
 
45
- return ClientToken.new(decrypted['cid'], decrypted['vid'], decrypted['fp'])
46
- rescue StandardError
47
- ClientToken.new('', '', '')
41
+ SecureNative::ClientToken.new(decrypted['cid'], decrypted['vid'], decrypted['fp'])
42
+ rescue StandardError
43
+ SecureNative::ClientToken.new('', '', '')
44
+ end
48
45
  end
49
46
  end
50
47
  end
@@ -1,25 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "resolv"
4
-
5
3
  module SecureNative
6
- class IpUtils
7
- def self.ip_address?(ip_address)
8
- return true if ip_address =~ Resolv::IPv4::Regex
9
- return true if ip_address =~ Resolv::IPv6::Regex
4
+ module Utils
5
+ class IpUtils
6
+ def self.ip_address?(ip_address)
7
+ return true if ip_address =~ Resolv::IPv4::Regex
8
+ return true if ip_address =~ Resolv::IPv6::Regex
10
9
 
11
- false
12
- end
10
+ false
11
+ end
13
12
 
14
- def self.valid_public_ip?(ip_address)
15
- ip = IPAddr.new(ip_address)
16
- return false if ip.loopback? || ip.private? || ip.link_local? || ip.untrusted? || ip.tainted?
13
+ def self.valid_public_ip?(ip_address)
14
+ ip = IPAddr.new(ip_address)
15
+ return false if ip.loopback? || ip.private? || ip.link_local? || ip.untrusted? || ip.tainted?
17
16
 
18
- true
19
- end
17
+ true
18
+ end
20
19
 
21
- def self.loop_back?(ip_address)
22
- IPAddr.new(ip_address).loopback?
20
+ def self.loop_back?(ip_address)
21
+ IPAddr.new(ip_address).loopback?
22
+ end
23
23
  end
24
24
  end
25
25
  end
@@ -3,7 +3,7 @@
3
3
  require 'logger'
4
4
 
5
5
  module SecureNative
6
- class SecureNativeLogger
6
+ class Log
7
7
  @logger = Logger.new(STDOUT)
8
8
 
9
9
  def self.init_logger(level = 'DEBUG')
@@ -1,81 +1,100 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SecureNative
4
- class RequestUtils
5
- SECURENATIVE_COOKIE = '_sn'
6
- SECURENATIVE_HEADER = 'x-securenative'
4
+ module Utils
5
+ class RequestUtils
6
+ SECURENATIVE_COOKIE = '_sn'
7
+ SECURENATIVE_HEADER = 'x-securenative'
8
+ PREFIX = 'HTTP_'
7
9
 
8
- def self.get_secure_header_from_request(headers)
9
- begin
10
- return headers[SECURENATIVE_HEADER] unless headers.nil?
11
- rescue StandardError
10
+ def self.get_secure_header_from_request(headers)
11
+ begin
12
+ return headers[SECURENATIVE_HEADER] unless headers.nil?
13
+ rescue StandardError
14
+ []
15
+ end
12
16
  []
13
17
  end
14
- []
15
- end
16
18
 
17
- def self.get_client_ip_from_request(request, options = nil)
18
- unless options.nil?
19
- for header in options.proxy_headers do
20
- begin
21
- h = request.env[header]
22
- return h.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless h.nil?
23
- rescue NoMethodError
19
+ def self.get_client_ip_from_request(request, options)
20
+ unless options.proxy_headers.nil?
21
+ options.proxy_headers.each { |header|
24
22
  begin
25
- h = request[header]
23
+ h = request.env[header]
24
+ if h.nil?
25
+ h = request.env[self.parse_ip(header)]
26
+ end
26
27
  return h.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless h.nil?
27
28
  rescue NoMethodError
29
+ begin
30
+ h = request[header]
31
+ if h.nil?
32
+ h = request.env[self.parse_ip(header)]
33
+ end
34
+ return h.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless h.nil?
35
+ rescue NoMethodError
36
+ # Ignored
37
+ end
28
38
  end
29
- end
39
+ }
30
40
  end
31
- end
32
41
 
33
- begin
34
- x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
35
- return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
36
- rescue NoMethodError
37
42
  begin
38
- x_forwarded_for = request['HTTP_X_FORWARDED_FOR']
43
+ x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
39
44
  return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
40
45
  rescue NoMethodError
46
+ begin
47
+ x_forwarded_for = request['HTTP_X_FORWARDED_FOR']
48
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
49
+ rescue NoMethodError
50
+ # Ignored
51
+ end
41
52
  end
42
- end
43
53
 
44
- begin
45
- x_forwarded_for = request.env['HTTP_X_REAL_IP']
46
- return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
47
- rescue NoMethodError
48
54
  begin
49
- x_forwarded_for = request['HTTP_X_REAL_IP']
55
+ x_forwarded_for = request.env['HTTP_X_REAL_IP']
50
56
  return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
51
57
  rescue NoMethodError
58
+ begin
59
+ x_forwarded_for = request['HTTP_X_REAL_IP']
60
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
61
+ rescue NoMethodError
62
+ # Ignored
63
+ end
52
64
  end
53
- end
54
65
 
55
- begin
56
- x_forwarded_for = request.env['REMOTE_ADDR']
57
- return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
58
- rescue NoMethodError
59
66
  begin
60
- x_forwarded_for = request['REMOTE_ADDR']
67
+ x_forwarded_for = request.env['REMOTE_ADDR']
61
68
  return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
62
69
  rescue NoMethodError
70
+ begin
71
+ x_forwarded_for = request['REMOTE_ADDR']
72
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
73
+ rescue NoMethodError
74
+ # Ignored
75
+ end
76
+ end
77
+
78
+ begin
79
+ return request.ip unless request.ip.nil?
80
+ rescue NoMethodError
81
+ # Ignored
63
82
  end
64
- end
65
83
 
66
- begin
67
- return request.ip unless request.ip.nil?
68
- rescue NoMethodError
84
+ ''
69
85
  end
70
86
 
71
- ''
72
- end
87
+ def self.get_remote_ip_from_request(request)
88
+ begin
89
+ request.remote_ip
90
+ rescue NoMethodError
91
+ ''
92
+ end
93
+ end
73
94
 
74
- def self.get_remote_ip_from_request(request)
75
- begin
76
- request.remote_ip
77
- rescue NoMethodError
78
- ''
95
+ def self.parse_ip(headers)
96
+ h = headers.gsub('-', '_')
97
+ return PREFIX + h.upcase
79
98
  end
80
99
  end
81
100
  end