securenative 0.1.23 → 0.1.24

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +3 -5
  3. data/README.md +36 -36
  4. data/lib/securenative/api_manager.rb +41 -0
  5. data/lib/securenative/config/configuration_builder.rb +29 -0
  6. data/lib/securenative/config/configuration_manager.rb +58 -0
  7. data/lib/securenative/config/securenative_options.rb +25 -0
  8. data/lib/securenative/context/hanami_context.rb +44 -0
  9. data/lib/securenative/context/rails_context.rb +46 -0
  10. data/lib/securenative/context/securenative_context.rb +69 -0
  11. data/lib/securenative/context/sinatra_context.rb +44 -0
  12. data/lib/securenative/enums/api_route.rb +8 -0
  13. data/lib/securenative/enums/event_types.rb +25 -0
  14. data/lib/securenative/enums/failover_strategy.rb +8 -0
  15. data/lib/securenative/enums/risk_level.rb +9 -0
  16. data/lib/securenative/errors/securenative_config_error.rb +6 -0
  17. data/lib/securenative/errors/securenative_http_error.rb +6 -0
  18. data/lib/securenative/errors/securenative_invalid_options_error.rb +6 -0
  19. data/lib/securenative/errors/securenative_invalid_uri_error.rb +6 -0
  20. data/lib/securenative/errors/securenative_parse_error.rb +6 -0
  21. data/lib/securenative/errors/securenative_sdk_Illegal_state_error.rb +6 -0
  22. data/lib/securenative/errors/securenative_sdk_error.rb +6 -0
  23. data/lib/securenative/event_manager.rb +159 -0
  24. data/lib/securenative/http/secure_native_http_response.rb +14 -0
  25. data/lib/securenative/http/securenative_http_client.rb +52 -0
  26. data/lib/securenative/models/client_token.rb +14 -0
  27. data/lib/securenative/models/device.rb +12 -0
  28. data/lib/securenative/models/event_options.rb +39 -0
  29. data/lib/securenative/models/request_context.rb +20 -0
  30. data/lib/securenative/models/request_options.rb +14 -0
  31. data/lib/securenative/models/sdk_event.rb +51 -0
  32. data/lib/securenative/models/user_traits.rb +15 -0
  33. data/lib/securenative/models/verify_result.rb +18 -0
  34. data/lib/securenative/sdk.rb +85 -0
  35. data/lib/securenative/utils/date_utils.rb +11 -0
  36. data/lib/securenative/utils/encryption_utils.rb +51 -0
  37. data/lib/securenative/utils/ip_utils.rb +25 -0
  38. data/lib/securenative/utils/request_utils.rb +71 -0
  39. data/lib/securenative/utils/secure_native_logger.rb +46 -0
  40. data/lib/securenative/utils/signature_utils.rb +18 -0
  41. data/lib/securenative/utils/utils.rb +11 -0
  42. data/lib/securenative/utils/version_utils.rb +13 -0
  43. data/securenative.gemspec +16 -14
  44. metadata +40 -40
  45. data/lib/api_manager.rb +0 -39
  46. data/lib/config/configuration_builder.rb +0 -27
  47. data/lib/config/configuration_manager.rb +0 -56
  48. data/lib/config/securenative_options.rb +0 -23
  49. data/lib/context/hanami_context.rb +0 -42
  50. data/lib/context/rails_context.rb +0 -44
  51. data/lib/context/securenative_context.rb +0 -67
  52. data/lib/context/sinatra_context.rb +0 -42
  53. data/lib/enums/api_route.rb +0 -6
  54. data/lib/enums/event_types.rb +0 -23
  55. data/lib/enums/failover_strategy.rb +0 -6
  56. data/lib/enums/risk_level.rb +0 -7
  57. data/lib/errors/securenative_config_error.rb +0 -4
  58. data/lib/errors/securenative_http_error.rb +0 -4
  59. data/lib/errors/securenative_invalid_options_error.rb +0 -4
  60. data/lib/errors/securenative_invalid_uri_error.rb +0 -4
  61. data/lib/errors/securenative_parse_error.rb +0 -4
  62. data/lib/errors/securenative_sdk_Illegal_state_error.rb +0 -4
  63. data/lib/errors/securenative_sdk_error.rb +0 -4
  64. data/lib/event_manager.rb +0 -157
  65. data/lib/http/secure_native_http_response.rb +0 -12
  66. data/lib/http/securenative_http_client.rb +0 -50
  67. data/lib/models/client_token.rb +0 -12
  68. data/lib/models/device.rb +0 -10
  69. data/lib/models/event_options.rb +0 -37
  70. data/lib/models/request_context.rb +0 -18
  71. data/lib/models/request_options.rb +0 -12
  72. data/lib/models/sdk_event.rb +0 -49
  73. data/lib/models/user_traits.rb +0 -13
  74. data/lib/models/verify_result.rb +0 -16
  75. data/lib/securenative.rb +0 -83
  76. data/lib/utils/date_utils.rb +0 -9
  77. data/lib/utils/encryption_utils.rb +0 -49
  78. data/lib/utils/ip_utils.rb +0 -23
  79. data/lib/utils/request_utils.rb +0 -69
  80. data/lib/utils/secure_native_logger.rb +0 -44
  81. data/lib/utils/signature_utils.rb +0 -16
  82. data/lib/utils/utils.rb +0 -9
  83. data/lib/utils/version_utils.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ba285b1ac9a68c9cb1143ab595a4c052636e47b8d4cc39e16821e0582e06a62
4
- data.tar.gz: c6295e963d7440c4dc8be4046077cafb4af96311f500fa2220717bf726b0ffba
3
+ metadata.gz: d106e0702046e45250d4005ee93dc1baa17d5fa31cf393f3993a5667e3d14703
4
+ data.tar.gz: caba785bb61b1c517d98669d59f9ef1ae6e357f49ef2dbfbd6f41eeb0c96f0da
5
5
  SHA512:
6
- metadata.gz: 7f78c7385e543d75dd106611eb77f71004fcb12d10702ae99a02af27cf3273bd45fcb2d5c7725a7001f143973f1cf2d70c19b3d57e3222d0b7965a40ec343f2c
7
- data.tar.gz: fada20df309348b5e74a8886fb5855d51aed1ad4ba2245dd23df60f409b1fd6e3bc11efd829b4b21a2b0fa9cf2dac45c08628f088e49879a09a45853aee52ef7
6
+ metadata.gz: ab405d8068d865533569350a378853d5b864ad3933f7d394c8fb81e3d08365bfffff6f1fdf9bd5da6e8ca25adb9355ca1cd473ce68aed723318fa86171834d9c
7
+ data.tar.gz: 2b0f71f461ac6c9ec58f9c7d3cc75ac6cde418ee70da7f2df73102e56ddf4a3a0d22d883f124efe95e807c2cd07ba969f860561eccc8d460a45e775aab324bf0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- securenative (0.1.23)
4
+ securenative (0.1.24)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -68,8 +68,7 @@ GEM
68
68
  json
69
69
  simplecov
70
70
  concurrent-ruby (1.1.7)
71
- crack (0.4.3)
72
- safe_yaml (~> 1.0.0)
71
+ crack (0.4.4)
73
72
  crass (1.0.6)
74
73
  diff-lcs (1.4.4)
75
74
  docile (1.3.2)
@@ -219,11 +218,10 @@ GEM
219
218
  rspec-support (~> 3.9.0)
220
219
  rspec-support (3.9.3)
221
220
  ruby2_keywords (0.0.2)
222
- safe_yaml (1.0.5)
223
221
  simplecov (0.19.0)
224
222
  docile (~> 1.1)
225
223
  simplecov-html (~> 0.11)
226
- simplecov-html (0.12.2)
224
+ simplecov-html (0.12.3)
227
225
  sinatra (2.1.0)
228
226
  mustermann (~> 1.0)
229
227
  rack (~> 2.2)
data/README.md CHANGED
@@ -50,36 +50,36 @@ To get your *API KEY*, login to your SecureNative account and go to project sett
50
50
  SecureNative can automatically load your config from *securenative.yml* file or from the file that is specified in your *SECURENATIVE_CONFIG_FILE* env variable:
51
51
 
52
52
  ```ruby
53
- require 'securenative'
53
+ require 'securenative/securenative'
54
54
 
55
55
 
56
- secureative = SecureNative.init
56
+ secureative = SecureNative::SecureNative.init
57
57
  ```
58
58
  ### Option 2: Initialize via API Key
59
59
 
60
60
  ```ruby
61
- require 'securenative'
61
+ require 'securenative/sdk'
62
62
 
63
63
 
64
- securenative = SecureNative.init_with_api_key('YOUR_API_KEY')
64
+ securenative = SecureNative::SecureNative.init_with_api_key('YOUR_API_KEY')
65
65
  ```
66
66
 
67
67
  ### Option 3: Initialize via ConfigurationBuilder
68
68
  ```ruby
69
- require 'securenative'
69
+ require 'securenative/sdk'
70
70
 
71
71
 
72
- options = ConfigurationBuilder.new(api_key: 'API_KEY', max_events: 10, log_level: 'ERROR')
73
- SecureNative.init_with_options(options)
72
+ options = SecureNative::ConfigurationBuilder.new(api_key: 'API_KEY', max_events: 10, log_level: 'ERROR')
73
+ SecureNative::SecureNative.init_with_options(options)
74
74
  ```
75
75
 
76
76
  ## Getting SecureNative instance
77
77
  Once initialized, sdk will create a singleton instance which you can get:
78
78
  ```ruby
79
- require 'securenative'
79
+ require 'securenative/sdk'
80
80
 
81
81
 
82
- secureNative = SecureNative.instance
82
+ secureNative = SecureNative::SecureNative.instance
83
83
  ```
84
84
 
85
85
  ## Tracking events
@@ -88,19 +88,19 @@ Once the SDK has been initialized, tracking requests sent through the SDK
88
88
  instance. Make sure you build event with the EventBuilder:
89
89
 
90
90
  ```ruby
91
- require 'securenative'
92
- require 'models/event_options'
93
- require 'enums/event_types'
94
- require 'models/user_traits'
91
+ require 'securenative/sdk'
92
+ require 'securenative/models/event_options'
93
+ require 'securenative/enums/event_types'
94
+ require 'securenative/models/user_traits'
95
95
 
96
96
 
97
97
  def track
98
- securenative = SecureNative.instance
99
- context = SecureNativeContext.new(client_token: 'SECURED_CLIENT_TOKEN', ip: '127.0.0.1',
98
+ securenative = SecureNative::SecureNative.instance
99
+ context = SecureNative::SecureNativeContext.new(client_token: 'SECURED_CLIENT_TOKEN', ip: '127.0.0.1',
100
100
  headers: { 'user-agent' => 'Mozilla: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.3 Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/43.4' })
101
101
 
102
- event_options = EventOptions.new(event: EventTypes::LOG_IN, user_id: '1234', context: context,
103
- user_traits: UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
102
+ event_options = SecureNative::EventOptions.new(event: SecureNative::EventTypes::LOG_IN, user_id: '1234', context: context,
103
+ user_traits: SecureNative::UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
104
104
  properties: { custom_param1: 'CUSTOM_PARAM_VALUE', custom_param2: true, custom_param3: 3 })
105
105
 
106
106
  securenative.track(event_options)
@@ -109,21 +109,21 @@ def track
109
109
  end
110
110
  ```
111
111
 
112
- You can also create request context from requests:
112
+ You can also create request securenative.context from requests:
113
113
 
114
114
  ```ruby
115
- require 'securenative'
116
- require 'models/event_options'
117
- require 'enums/event_types'
118
- require 'models/user_traits'
115
+ require 'securenative/sdk'
116
+ require 'securenative/models/event_options'
117
+ require 'securenative/enums/event_types'
118
+ require 'securenative/models/user_traits'
119
119
 
120
120
 
121
121
  def track(request)
122
- securenative = SecureNative.instance
123
- context = SecureNativeContext.from_http_request(request)
122
+ securenative = SecureNative::SecureNative.instance
123
+ context = SecureNative::SecureNativeContext.from_http_request(request)
124
124
 
125
- event_options = EventOptions.new(event: EventTypes::LOG_IN, user_id: '1234', context: context,
126
- user_traits: UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
125
+ event_options = SecureNative::EventOptions.new(event: SecureNative::EventTypes::LOG_IN, user_id: '1234', context: context,
126
+ user_traits: SecureNative::UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
127
127
  properties: { custom_param1: 'CUSTOM_PARAM_VALUE', custom_param2: true, custom_param3: 3 })
128
128
 
129
129
  securenative.track(event_options)
@@ -137,18 +137,18 @@ end
137
137
  **Example**
138
138
 
139
139
  ```ruby
140
- require 'securenative'
141
- require 'models/event_options'
142
- require 'enums/event_types'
143
- require 'models/user_traits'
140
+ require 'securenative/sdk'
141
+ require 'securenative/models/event_options'
142
+ require 'securenative/enums/event_types'
143
+ require 'securenative/models/user_traits'
144
144
 
145
145
 
146
146
  def verify(request)
147
- securenative = SecureNative.instance
148
- context = SecureNativeContext.from_http_request(request)
147
+ securenative = SecureNative::SecureNative.instance
148
+ context = SecureNative::SecureNativeContext.from_http_request(request)
149
149
 
150
- event_options = EventOptions.new(event: EventTypes::LOG_IN, user_id: '1234', context: context,
151
- user_traits: UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
150
+ event_options = SecureNative::EventOptions.new(event: SecureNative::EventTypes::LOG_IN, user_id: '1234', context: context,
151
+ user_traits: SecureNative::UserTraits.new(name: 'Your Name', email: 'name@gmail.com', phone: '+1234567890'),
152
152
  properties: { custom_param1: 'CUSTOM_PARAM_VALUE', custom_param2: true, custom_param3: 3 })
153
153
 
154
154
  verify_result = securenative.verify(event_options)
@@ -163,11 +163,11 @@ end
163
163
  Apply our filter to verify the request is from us, for example:
164
164
 
165
165
  ```ruby
166
- require 'securenative'
166
+ require 'securenative/sdk'
167
167
 
168
168
 
169
169
  def webhook_endpoint(request)
170
- securenative = SecureNative.instance
170
+ securenative = SecureNative::SecureNative.instance
171
171
 
172
172
  # Checks if request is verified
173
173
  is_verified = securenative.verify_request_payload(request)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securenative/models/sdk_event'
4
+ require 'securenative/enums/failover_strategy'
5
+ require 'securenative/enums/risk_level'
6
+ require 'securenative/enums/api_route'
7
+ require 'securenative/models/verify_result'
8
+ require 'json'
9
+
10
+ module SecureNative
11
+ class ApiManager
12
+ def initialize(event_manager, securenative_options)
13
+ @event_manager = event_manager
14
+ @options = securenative_options
15
+ end
16
+
17
+ def track(event_options)
18
+ SecureNativeLogger.debug('Track event call')
19
+ event = SDKEvent.new(event_options, @options)
20
+ @event_manager.send_async(event, ApiRoute::TRACK)
21
+ end
22
+
23
+ def verify(event_options)
24
+ SecureNativeLogger.debug('Verify event call')
25
+ event = SDKEvent.new(event_options, @options)
26
+
27
+ begin
28
+ res = @event_manager.send_sync(event, ApiRoute::VERIFY, false)
29
+ ver_result = JSON.parse(res.body)
30
+ return VerifyResult.new(risk_level: ver_result['riskLevel'], score: ver_result['score'], triggers: ver_result['triggers'])
31
+ rescue StandardError => e
32
+ SecureNativeLogger.debug("Failed to call verify; #{e}")
33
+ end
34
+ if @options.fail_over_strategy == FailOverStrategy::FAIL_OPEN
35
+ return VerifyResult.new(risk_level: RiskLevel::LOW, score: 0, triggers: nil)
36
+ end
37
+
38
+ VerifyResult.new(risk_level: RiskLevel::HIGH, score: 1, triggers: nil)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securenative/enums/failover_strategy'
4
+
5
+ module SecureNative
6
+ class ConfigurationBuilder
7
+ attr_reader :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
8
+ attr_writer :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
9
+
10
+ def initialize(api_key: nil, api_url: 'https://api.securenative.com/collector/api/v1', interval: 1000,
11
+ max_events: 1000, timeout: 1500, auto_send: true, disable: false, log_level: 'FATAL',
12
+ fail_over_strategy: FailOverStrategy::FAIL_OPEN, proxy_headers: nil)
13
+ @api_key = api_key
14
+ @api_url = api_url
15
+ @interval = interval
16
+ @max_events = max_events
17
+ @timeout = timeout
18
+ @auto_send = auto_send
19
+ @disable = disable
20
+ @log_level = log_level
21
+ @fail_over_strategy = fail_over_strategy
22
+ @proxy_headers = proxy_headers
23
+ end
24
+
25
+ def self.default_securenative_options
26
+ SecureNativeOptions.new
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'securenative/config/configuration_builder'
5
+
6
+ module SecureNative
7
+ class ConfigurationManager
8
+ DEFAULT_CONFIG_FILE = 'securenative.yml'
9
+ CUSTOM_CONFIG_FILE_ENV_NAME = 'SECURENATIVE_CONFIG_FILE'
10
+ @config = nil
11
+
12
+ def self.read_resource_file(resource_path)
13
+ properties = {}
14
+ begin
15
+ @config = YAML.load_file(resource_path)
16
+ properties = @config unless @config.nil?
17
+ rescue StandardError => e
18
+ SecureNativeLogger.error("Could not parse securenative.config file #{resource_path}; #{e}")
19
+ end
20
+ properties
21
+ end
22
+
23
+ def self._get_resource_path(env_name)
24
+ Env.fetch(env_name, ENV[DEFAULT_CONFIG_FILE])
25
+ end
26
+
27
+ def self.config_builder
28
+ ConfigurationBuilder.new
29
+ end
30
+
31
+ def self._get_env_or_default(properties, key, default)
32
+ return ENV[key] if ENV[key]
33
+ return properties[key] if properties[key]
34
+
35
+ default
36
+ end
37
+
38
+ def self.load_config
39
+ options = ConfigurationBuilder.default_securenative_options
40
+
41
+ resource_path = DEFAULT_CONFIG_FILE
42
+ resource_path = ENV[CUSTOM_CONFIG_FILE_ENV_NAME] unless ENV[CUSTOM_CONFIG_FILE_ENV_NAME].nil?
43
+
44
+ properties = read_resource_file(resource_path)
45
+
46
+ ConfigurationBuilder.new(api_key: _get_env_or_default(properties, 'SECURENATIVE_API_KEY', options.api_key),
47
+ api_url: _get_env_or_default(properties, 'SECURENATIVE_API_URL', options.api_url),
48
+ interval: _get_env_or_default(properties, 'SECURENATIVE_INTERVAL', options.interval),
49
+ max_events: _get_env_or_default(properties, 'SECURENATIVE_MAX_EVENTS', options.max_events),
50
+ timeout: _get_env_or_default(properties, 'SECURENATIVE_TIMEOUT', options.timeout),
51
+ auto_send: _get_env_or_default(properties, 'SECURENATIVE_AUTO_SEND', options.auto_send),
52
+ disable: _get_env_or_default(properties, 'SECURENATIVE_DISABLE', options.disable),
53
+ log_level: _get_env_or_default(properties, 'SECURENATIVE_LOG_LEVEL', options.log_level),
54
+ fail_over_strategy: _get_env_or_default(properties, 'SECURENATIVE_FAILOVER_STRATEGY', options.fail_over_strategy),
55
+ proxy_headers: _get_env_or_default(properties, 'SECURENATIVE_PROXY_HEADERS', options.proxy_headers))
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securenative/enums/failover_strategy'
4
+
5
+ module SecureNative
6
+ class SecureNativeOptions
7
+ attr_reader :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
8
+ attr_writer :api_key, :api_url, :interval, :max_events, :timeout, :auto_send, :disable, :log_level, :fail_over_strategy, :proxy_headers
9
+
10
+ def initialize(api_key: nil, api_url: "https://api.securenative.com/collector/api/v1", interval: 1000,
11
+ max_events: 1000, timeout: 1500, auto_send: true, disable: false, log_level: "FATAL",
12
+ fail_over_strategy: FailOverStrategy::FAIL_OPEN, proxy_headers: nil)
13
+ @api_key = api_key
14
+ @api_url = api_url
15
+ @interval = interval
16
+ @max_events = max_events
17
+ @timeout = timeout
18
+ @auto_send = auto_send
19
+ @disable = disable
20
+ @log_level = log_level
21
+ @fail_over_strategy = fail_over_strategy
22
+ @proxy_headers = proxy_headers
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ class HanamiContext
5
+ SECURENATIVE_COOKIE = '_sn'
6
+
7
+ def self.get_client_token(request)
8
+ begin
9
+ request.env[SECURENATIVE_COOKIE]
10
+ rescue StandardError
11
+ begin
12
+ request.cookies[SECURENATIVE_COOKIE]
13
+ rescue StandardError
14
+ nil
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.get_url(request)
20
+ begin
21
+ request.env['REQUEST_PATH']
22
+ rescue StandardError
23
+ nil
24
+ end
25
+ end
26
+
27
+ def self.get_method(request)
28
+ begin
29
+ request.request_method
30
+ rescue StandardError
31
+ nil
32
+ end
33
+ end
34
+
35
+ def self.get_headers(request)
36
+ begin
37
+ # Note: At the moment we're filtering out everything but user-agent since ruby's payload is way too big
38
+ { 'user-agent' => request.env['HTTP_USER_AGENT'] }
39
+ rescue StandardError
40
+ nil
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ class RailsContext
5
+ SECURENATIVE_COOKIE = '_sn'
6
+
7
+ def self.get_client_token(request)
8
+ begin
9
+ request.cookies[SECURENATIVE_COOKIE]
10
+ rescue StandardError
11
+ nil
12
+ end
13
+ end
14
+
15
+ def self.get_url(request)
16
+ begin
17
+ # Rails >= 3.x
18
+ request.fullpath
19
+ rescue StandardError
20
+ begin
21
+ # Rails < 3.x & Sinatra
22
+ request.url if url.nil?
23
+ rescue StandardError
24
+ nil
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.get_method(request)
30
+ begin
31
+ request.method
32
+ rescue StandardError
33
+ nil
34
+ end
35
+ end
36
+
37
+ def self.get_headers(request)
38
+ begin
39
+ # Note: At the moment we're filtering out everything but user-agent since ruby's payload is way too big
40
+ {'user-agent' => request.env['HTTP_USER_AGENT']}
41
+ rescue StandardError
42
+ nil
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securenative/utils/request_utils'
4
+ require 'securenative/utils/utils'
5
+ require 'securenative/context/rails_context'
6
+ require 'securenative/context/hanami_context'
7
+ require 'securenative/context/sinatra_context'
8
+
9
+ module SecureNative
10
+ class SecureNativeContext
11
+ attr_reader :client_token, :ip, :remote_ip, :headers, :url, :http_method, :body
12
+ attr_writer :client_token, :ip, :remote_ip, :headers, :url, :http_method, :body
13
+
14
+ SECURENATIVE_COOKIE = '_sn'
15
+
16
+ def initialize(client_token: '', ip: '', remote_ip: '', headers: nil, url: '', http_method: '', body: '')
17
+ @client_token = client_token
18
+ @ip = ip
19
+ @remote_ip = remote_ip
20
+ @headers = headers
21
+ @url = url
22
+ @http_method = http_method
23
+ @body = body
24
+ end
25
+
26
+ def self.default_context_builder
27
+ SecureNativeContext.new
28
+ end
29
+
30
+ def self.from_http_request(request)
31
+ client_token = RailsContext.get_client_token(request)
32
+ client_token = SinatraContext.get_client_token(request) if client_token.nil?
33
+ client_token = HanamiContext.get_client_token(request) if client_token.nil?
34
+
35
+ begin
36
+ headers = RailsContext.get_headers(request)
37
+ headers = SinatraContext.get_headers(request) if headers.nil?
38
+ headers = HanamiContext.get_headers(request) if headers.nil?
39
+
40
+ # Standard Ruby request
41
+ headers = request.header.to_hash if headers.nil?
42
+ rescue StandardError
43
+ headers = []
44
+ end
45
+
46
+ url = RailsContext.get_url(request)
47
+ url = SinatraContext.get_url(request) if url.nil?
48
+ url = HanamiContext.get_url(request) if url.nil?
49
+ url = '' if url.nil?
50
+
51
+ method = RailsContext.get_method(request)
52
+ method = SinatraContext.get_method(request) if method.nil?
53
+ method = HanamiContext.get_method(request) if method.nil?
54
+ method = '' if method.nil?
55
+
56
+ begin
57
+ body = request.body.to_s
58
+ rescue StandardError
59
+ body = ''
60
+ end
61
+
62
+ client_token = RequestUtils.get_secure_header_from_request(headers) if Utils.null_or_empty?(client_token)
63
+
64
+ SecureNativeContext.new(client_token: client_token, ip: RequestUtils.get_client_ip_from_request(request),
65
+ remote_ip: RequestUtils.get_remote_ip_from_request(request),
66
+ headers: headers, url: url, http_method: method || '', body: body)
67
+ end
68
+ end
69
+ end