securenative 0.1.16 → 0.1.22

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +7 -15
  3. data/.github/workflows/publish.yml +1 -1
  4. data/.github/workflows/test.yml +5 -2
  5. data/.gitignore +3 -1
  6. data/Gemfile +6 -4
  7. data/Gemfile.lock +234 -23
  8. data/README.md +38 -33
  9. data/lib/api_manager.rb +39 -0
  10. data/lib/config/configuration_builder.rb +26 -0
  11. data/lib/config/configuration_manager.rb +55 -0
  12. data/lib/config/securenative_options.rb +22 -0
  13. data/lib/context/hanami_context.rb +42 -0
  14. data/lib/context/rails_context.rb +44 -0
  15. data/lib/context/securenative_context.rb +67 -0
  16. data/lib/context/sinatra_context.rb +42 -0
  17. data/lib/enums/api_route.rb +6 -0
  18. data/lib/enums/event_types.rb +23 -0
  19. data/lib/enums/failover_strategy.rb +6 -0
  20. data/lib/enums/risk_level.rb +7 -0
  21. data/lib/errors/securenative_config_error.rb +4 -0
  22. data/lib/errors/securenative_http_error.rb +4 -0
  23. data/lib/errors/securenative_invalid_options_error.rb +4 -0
  24. data/lib/errors/securenative_invalid_uri_error.rb +4 -0
  25. data/lib/errors/securenative_parse_error.rb +4 -0
  26. data/lib/errors/securenative_sdk_Illegal_state_error.rb +4 -0
  27. data/lib/errors/securenative_sdk_error.rb +4 -0
  28. data/lib/event_manager.rb +157 -0
  29. data/lib/http/secure_native_http_response.rb +12 -0
  30. data/lib/http/securenative_http_client.rb +50 -0
  31. data/lib/{securenative/models → models}/client_token.rb +2 -0
  32. data/lib/{securenative/models → models}/device.rb +3 -1
  33. data/lib/models/event_options.rb +37 -0
  34. data/lib/models/request_context.rb +18 -0
  35. data/lib/models/request_options.rb +12 -0
  36. data/lib/models/sdk_event.rb +49 -0
  37. data/lib/models/user_traits.rb +13 -0
  38. data/lib/models/verify_result.rb +16 -0
  39. data/lib/securenative.rb +83 -0
  40. data/lib/utils/date_utils.rb +9 -0
  41. data/lib/utils/encryption_utils.rb +49 -0
  42. data/lib/{securenative/utils → utils}/ip_utils.rb +7 -6
  43. data/lib/utils/request_utils.rb +54 -0
  44. data/lib/{securenative/logger.rb → utils/secure_native_logger.rb} +5 -3
  45. data/lib/{securenative/utils → utils}/signature_utils.rb +4 -2
  46. data/lib/utils/utils.rb +9 -0
  47. data/lib/utils/version_utils.rb +11 -0
  48. data/{lib/securenative → out/production/securenative-ruby}/api_manager.rb +6 -5
  49. data/{lib/securenative → out/production/securenative-ruby}/config/configuration_builder.rb +7 -3
  50. data/{lib/securenative → out/production/securenative-ruby}/config/configuration_manager.rb +5 -3
  51. data/{lib/securenative → out/production/securenative-ruby}/config/securenative_options.rb +3 -1
  52. data/out/production/securenative-ruby/context/securenative_context.rb +40 -0
  53. data/out/production/securenative-ruby/enums/api_route.rb +6 -0
  54. data/out/production/securenative-ruby/enums/event_types.rb +23 -0
  55. data/out/production/securenative-ruby/enums/failover_strategy.rb +6 -0
  56. data/out/production/securenative-ruby/enums/risk_level.rb +7 -0
  57. data/out/production/securenative-ruby/errors/securenative_config_error.rb +4 -0
  58. data/out/production/securenative-ruby/errors/securenative_http_error.rb +4 -0
  59. data/out/production/securenative-ruby/errors/securenative_invalid_options_error.rb +4 -0
  60. data/out/production/securenative-ruby/errors/securenative_invalid_uri_error.rb +4 -0
  61. data/out/production/securenative-ruby/errors/securenative_parse_error.rb +4 -0
  62. data/out/production/securenative-ruby/errors/securenative_sdk_Illegal_state_error.rb +4 -0
  63. data/out/production/securenative-ruby/errors/securenative_sdk_error.rb +4 -0
  64. data/out/production/securenative-ruby/event_manager.rb +156 -0
  65. data/out/production/securenative-ruby/event_options.rb +32 -0
  66. data/{lib/securenative → out/production/securenative-ruby}/http/http_response.rb +3 -1
  67. data/out/production/securenative-ruby/http/securenative_http_client.rb +32 -0
  68. data/out/production/securenative-ruby/models/client_token.rb +12 -0
  69. data/out/production/securenative-ruby/models/device.rb +10 -0
  70. data/{lib/securenative → out/production/securenative-ruby}/models/event_options.rb +3 -1
  71. data/{lib/securenative → out/production/securenative-ruby}/models/request_context.rb +5 -2
  72. data/out/production/securenative-ruby/models/request_options.rb +12 -0
  73. data/{lib/securenative → out/production/securenative-ruby}/models/sdk_event.rb +11 -3
  74. data/out/production/securenative-ruby/models/user_traits.rb +13 -0
  75. data/{lib/securenative → out/production/securenative-ruby}/models/verify_result.rb +3 -1
  76. data/{lib/securenative → out/production/securenative-ruby}/securenative.rb +24 -15
  77. data/out/production/securenative-ruby/utils/date_utils.rb +9 -0
  78. data/{lib/securenative → out/production/securenative-ruby}/utils/encryption_utils.rb +1 -4
  79. data/out/production/securenative-ruby/utils/ip_utils.rb +23 -0
  80. data/{lib/securenative → out/production/securenative-ruby}/utils/request_utils.rb +5 -3
  81. data/out/production/securenative-ruby/utils/secure_native_logger.rb +44 -0
  82. data/out/production/securenative-ruby/utils/signature_utils.rb +16 -0
  83. data/out/production/securenative-ruby/utils/utils.rb +9 -0
  84. data/{lib/securenative → out/production/securenative-ruby}/utils/version_utils.rb +3 -1
  85. data/out/test/securenative-ruby/spec_api_manager.rb +81 -0
  86. data/out/test/securenative-ruby/spec_context_builder.rb +69 -0
  87. data/out/test/securenative-ruby/spec_date_utils.rb +13 -0
  88. data/out/test/securenative-ruby/spec_encryption_utils.rb +26 -0
  89. data/out/test/securenative-ruby/spec_event_manager.rb +59 -0
  90. data/out/test/securenative-ruby/spec_helper.rb +20 -0
  91. data/out/test/securenative-ruby/spec_ip_utils.rb +41 -0
  92. data/out/test/securenative-ruby/spec_securenative.rb +65 -0
  93. data/out/test/securenative-ruby/spec_securenative_http_client.rb +23 -0
  94. data/out/test/securenative-ruby/spec_signature_utils.rb +18 -0
  95. data/securenative.gemspec +2 -2
  96. metadata +88 -43
  97. data/.travis.yml +0 -6
  98. data/VERSION +0 -1
  99. data/lib/securenative/context/context_builder.rb +0 -59
  100. data/lib/securenative/context/securenative_context.rb +0 -14
  101. data/lib/securenative/enums/api_route.rb +0 -4
  102. data/lib/securenative/enums/event_types.rb +0 -21
  103. data/lib/securenative/enums/failover_strategy.rb +0 -4
  104. data/lib/securenative/enums/risk_level.rb +0 -5
  105. data/lib/securenative/event_manager.rb +0 -149
  106. data/lib/securenative/event_options_builder.rb +0 -21
  107. data/lib/securenative/exceptions/securenative_config_exception.rb +0 -2
  108. data/lib/securenative/exceptions/securenative_http_exception.rb +0 -2
  109. data/lib/securenative/exceptions/securenative_invalid_options_exception.rb +0 -2
  110. data/lib/securenative/exceptions/securenative_invalid_uri_exception.rb +0 -2
  111. data/lib/securenative/exceptions/securenative_parse_exception.rb +0 -2
  112. data/lib/securenative/exceptions/securenative_sdk_Illegal_state_exception.rb +0 -2
  113. data/lib/securenative/exceptions/securenative_sdk_exception.rb +0 -2
  114. data/lib/securenative/http/securenative_http_client.rb +0 -30
  115. data/lib/securenative/models/request_options.rb +0 -10
  116. data/lib/securenative/models/user_traits.rb +0 -10
  117. data/lib/securenative/securenative.iml +0 -9
  118. data/lib/securenative/utils/date_utils.rb +0 -7
  119. data/lib/securenative/utils/utils.rb +0 -9
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'context/securenative_context'
4
+ require 'webmock/rspec'
5
+ require 'rspec'
6
+
7
+ RSpec.describe SecureNativeContext do
8
+ it 'creates context from request' do
9
+ stub_request(:any, 'www.example.com')
10
+ .to_return(body: nil, status: 200,
11
+ headers: { 'x-securenative': '71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a' },
12
+ remote_ip: '', uri: 'www.securenative.com', http_method: 'Post', ip: '51.68.201.122',
13
+ client_token: '71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a')
14
+
15
+ request = Net::HTTP.get('www.example.com', '/')
16
+ context = SecureNativeContext.from_http_request(request)
17
+
18
+ expect(context.client_token).to eq('71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a')
19
+ expect(context.ip).to eq('51.68.201.122')
20
+ expect(context.http_method).to eq('Post')
21
+ expect(context.uri).to eq('www.securenative.com')
22
+ expect(context.remote_ip).to eq('')
23
+ expect(context.headers).to eq({ 'x-securenative': '71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a' })
24
+ expect(context.body).to be_nil
25
+ end
26
+
27
+ it 'creates context from request with cookie' do
28
+ stub_request(:any, 'www.example.com')
29
+ .to_return(body: nil, status: 200,
30
+ cookies: { '_sn': '71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a' },
31
+ remote_ip: '', uri: 'www.securenative.com', http_method: 'Post', ip: '51.68.201.122',
32
+ client_token: '71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a')
33
+
34
+ request = Net::HTTP.get('www.example.com', '/')
35
+ con = SecureNativeContext.from_http_request(request)
36
+
37
+ expect(con.context.client_token).to eq('71532c1fad2c7f56118f7969e401f3cf080239140d208e7934e6a530818c37e544a0c2330a487bcc6fe4f662a57f265a3ed9f37871e80529128a5e4f2ca02db0fb975ded401398f698f19bb0cafd68a239c6caff99f6f105286ab695eaf3477365bdef524f5d70d9be1d1d474506b433aed05d7ed9a435eeca357de57817b37c638b6bb417ffb101eaf856987615a77a')
38
+ expect(con.context.ip).to eq('51.68.201.122')
39
+ expect(con.context.http_method).to eq('Post')
40
+ expect(con.context.uri).to eq('www.securenative.com')
41
+ expect(con.context.remote_ip).to eq('')
42
+ expect(con.context.body).to be_nil
43
+ end
44
+
45
+ it 'creates default context builder' do
46
+ context = SecureNativeContext.default_context_builder
47
+
48
+ expect(context.client_token).to be_nil
49
+ expect(context.ip).to be_nil
50
+ expect(context.http_method).to be_nil
51
+ expect(context.url).to be_nil
52
+ expect(context.remote_ip).to be_nil
53
+ expect(context.headers).to be_nil
54
+ expect(context.body).to be_nil
55
+ end
56
+
57
+ it 'creates custom context with context builder' do
58
+ context = SecureNativeContext.new('SECRET_TOKEN', '10.0.0.0', '10.0.0.0',
59
+ { 'header' => 'value1' }, '/some-url', 'Get', nil)
60
+
61
+ expect(context.url).to eq('/some-url')
62
+ expect(context.client_token).to eq('SECRET_TOKEN')
63
+ expect(context.ip).to eq('10.0.0.0')
64
+ expect(context.body).to be_nil
65
+ expect(context.http_method).to eq('Get')
66
+ expect(context.remote_ip).to eq('10.0.0.0')
67
+ expect(context.headers).to eq({ 'header' => 'value1' })
68
+ end
69
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'utils/date_utils'
4
+ require 'rspec'
5
+
6
+ RSpec.describe DateUtils do
7
+ it 'converts to timestamp' do
8
+ iso_8601_date = '2020-05-20T15:07:13Z'
9
+ result = DateUtils.to_timestamp(iso_8601_date)
10
+
11
+ expect(result).to eq(iso_8601_date)
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'utils/encryption_utils'
4
+ require 'rspec'
5
+
6
+ RSpec.describe EncryptionUtils do
7
+ let(:SECRET_KEY) { 'B00C42DAD33EAC6F6572DA756EA4915349C0A4F6' }
8
+ let(:PAYLOAD) { '{"cid":"198a41ff-a10f-4cda-a2f3-a9ca80c0703b","vi":"148a42ff-b40f-4cda-a2f3-a8ca80c0703b","fp":"6d8cabd95987f8318b1fe01593d5c2a5.24700f9f1986800ab4fcc880530dd0ed"}' }
9
+ let(:CID) { '198a41ff-a10f-4cda-a2f3-a9ca80c0703b' }
10
+ let(:FP) { '6d8cabd95987f8318b1fe01593d5c2a5.24700f9f1986800ab4fcc880530dd0ed' }
11
+
12
+ it 'decrypts' do
13
+ result = EncryptionUtils.encrypt(:PAYLOAD, :SECRET_KEY)
14
+
15
+ expect(result).not_to be_nil
16
+ expect(result.length).to eq(:PAYLOAD.length)
17
+ end
18
+
19
+ it 'encrypts' do
20
+ encrypted_payload = '5208ae703cc2fa0851347f55d3b76d3fd6035ee081d71a401e8bc92ebdc25d42440f62310bda60628537744ac03f200d78da9e61f1019ce02087b7ce6c976e7b2d8ad6aa978c532cea8f3e744cc6a5cafedc4ae6cd1b08a4ef75d6e37aa3c0c76954d16d57750be2980c2c91ac7ef0bbd0722abd59bf6be22493ea9b9759c3ff4d17f17ab670b0b6fc320e6de982313f1c4e74c0897f9f5a32d58e3e53050ae8fdbebba9009d0d1250fe34dcde1ebb42acbc22834a02f53889076140f0eb8db1'
21
+ result = EncryptionUtils.decrypt(encrypted_payload, :SECRET_KEY)
22
+
23
+ expect(result.cid).to eq(:CID)
24
+ expect(result.fp).to eq(:FP)
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'event_manager'
4
+ require 'config/configuration_builder'
5
+ require 'rspec'
6
+ require 'webmock/rspec'
7
+
8
+ class SampleEvent
9
+ attr_reader :event_type, :timestamp, :rid, :user_id, :user_traits, :request, :properties
10
+
11
+ def initialize
12
+ @event_type = 'custom-event'
13
+ @timestamp = Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%Z')
14
+ @rid = '432532'
15
+ @user_id = '1'
16
+ @user_traits = UserTraits('some user', 'email@securenative.com', '+1234567890')
17
+ @request = RequestContext()
18
+ @properties = []
19
+ end
20
+ end
21
+
22
+ RSpec.describe EventManager do
23
+ let(:event) { SampleEvent() }
24
+
25
+ it 'successfully sends sync event with status code 200' do
26
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
27
+
28
+ res_body = '{"data": true}'
29
+ stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/some-path/to-api')
30
+ .with(body: JSON.parse(res_body)).to_return(status: 200)
31
+ event_manager = EventManager.new(options)
32
+
33
+ event_manager.start_event_persist
34
+ data = event_manager.send_sync(:event, 'some-path/to-api', false)
35
+ event_manager.stop_event_persist
36
+
37
+ expect(res_body).to eq(data.text)
38
+ end
39
+
40
+ it 'fails when send sync event status code is 401' do
41
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
42
+
43
+ stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/some-path/to-api').to_return(status: 401)
44
+ event_manager = EventManager.new(options)
45
+ res = event_manager.send_sync(:event, 'some-path/to-api', false)
46
+
47
+ expect(res.status_code).to eq(401)
48
+ end
49
+
50
+ it 'fails when send sync event status code is 500' do
51
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
52
+
53
+ stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/some-path/to-api').to_return(status: 500)
54
+ event_manager = EventManager.new(options)
55
+ res = event_manager.send_sync(:event, 'some-path/to-api', false)
56
+
57
+ expect(res.status_code).to eq(500)
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'simplecov'
5
+ require 'codecov'
6
+
7
+ SimpleCov.start
8
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
9
+
10
+ RSpec.configure do |config|
11
+ # Enable flags like --only-failures and --next-failure
12
+ config.example_status_persistence_file_path = '.rspec_status'
13
+
14
+ # Disable RSpec exposing methods globally on `Module` and `main`
15
+ config.disable_monkey_patching!
16
+
17
+ config.expect_with :rspec do |c|
18
+ c.syntax = :expect
19
+ end
20
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'utils/ip_utils'
4
+ require 'rspec'
5
+
6
+ RSpec.describe IpUtils do
7
+ it 'checks if ip address valid ipv4' do
8
+ valid_ipv4 = '172.16.254.1'
9
+ expect(IpUtils.ip_address?(valid_ipv4)).to be_truthy
10
+ end
11
+
12
+ it 'checks if ip address valid ipv6' do
13
+ valid_ipv6 = '2001:db8:1234:0000:0000:0000:0000:0000'
14
+ expect(IpUtils.ip_address?(valid_ipv6)).to be_truthy
15
+ end
16
+
17
+ it 'checks if ip address invalid ipv4' do
18
+ invalid_ipv4 = '172.16.2541'
19
+ expect(IpUtils.ip_address?(invalid_ipv4)).to be_falsey
20
+ end
21
+
22
+ it 'checks if ip address invalid ipv6' do
23
+ invalid_ipv6 = '2001:db8:1234:0000'
24
+ expect(IpUtils.ip_address?(invalid_ipv6)).to be_falsey
25
+ end
26
+
27
+ it 'checks if valid public ip' do
28
+ ip = '64.71.222.37'
29
+ expect(IpUtils.valid_public_ip?(ip)).to be_truthy
30
+ end
31
+
32
+ it 'checks if not valid public ip' do
33
+ ip = '10.0.0.0'
34
+ expect(IpUtils.valid_public_ip?(ip)).to be_falsey
35
+ end
36
+
37
+ it 'checks if valid loopback ip' do
38
+ ip = '127.0.0.1'
39
+ expect(IpUtils.loop_back?(ip)).to be_truthy
40
+ end
41
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securenative'
4
+ require 'config/configuration_manager'
5
+ require 'errors/securenative_sdk_error'
6
+ require 'errors/securenative_sdk_Illegal_state_error'
7
+ require 'errors/securenative_config_error'
8
+ require 'rspec'
9
+
10
+ RSpec.describe SecureNative do
11
+ it 'gets sdk instance without init throws' do
12
+ expect { SecureNative.instance }.to raise_error(SecureNativeSDKIllegalStateError)
13
+ end
14
+
15
+ it 'inits sdk without api key and throws' do
16
+ expect { SecureNative.init_with_options(ConfigurationManager.config_builder) }.to raise_error(SecureNativeSDKError)
17
+ end
18
+
19
+ it 'inits sdk with empty api key and throws' do
20
+ expect { SecureNative.init_with_api_key('') }.to raise_error(SecureNativeConfigError)
21
+ end
22
+
23
+ # TODO: fix event manager
24
+ # it 'inits sdk with api key and defaults' do
25
+ # SecureNative._flush
26
+ # api_key = 'API_KEY'
27
+ # securenative = SecureNative.init_with_api_key(api_key)
28
+ # options = securenative.options
29
+ #
30
+ # expect(options.api_key).to eq(api_key)
31
+ # expect(options.api_url).to eq('https://api.securenative.com/collector/api/v1')
32
+ # expect(options.interval).to eq(1000)
33
+ # expect(options.timeout).to eq(1500)
34
+ # expect(options.max_events).to eq(100)
35
+ # expect(options.auto_send).to eq(true)
36
+ # expect(options.disable).to eq(false)
37
+ # expect(options.log_level).to eq('FATAL')
38
+ # expect(options.fail_over_strategy).to eq(FailOverStrategy::FAIL_OPEN)
39
+ # end
40
+
41
+ # TODO: fix event manager
42
+ # it 'inits sdk twice and throws' do
43
+ # expect { SecureNative.init_with_api_key('API_KEY') }.to raise_error(SecureNativeSDKError)
44
+ # end
45
+
46
+ # TODO: fix event manager
47
+ # it 'inits sdk with api key and gets instance' do
48
+ # SecureNative._flush
49
+ # api_key = 'API_KEY'
50
+ # securenative = SecureNative.init_with_api_key(api_key)
51
+ #
52
+ # expect(securenative).to eq(SecureNative.instance)
53
+ # end
54
+
55
+ # TODO: fix event manager
56
+ # it 'inits sdk with builder' do
57
+ # SecureNative._flush
58
+ # securenative = SecureNative.init_with_options(SecureNative.config_builder(api_key: 'API_KEY', max_events: 10, log_level: 'ERROR'))
59
+ # options = securenative.options
60
+ #
61
+ # expect(options.api_key).to eq('API_KEY')
62
+ # expect(options.max_events).to eq(10)
63
+ # expect(options.log_level).to eq('ERROR')
64
+ # end
65
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'http/securenative_http_client'
4
+ require 'config/configuration_builder'
5
+ require 'webmock/rspec'
6
+ require 'rspec'
7
+
8
+ RSpec.describe SecureNativeHttpClient do
9
+ it 'makes a simple post call' do
10
+ options = ConfigurationBuilder.new(api_key: 'YOUR_API_KEY', api_url: 'https://api.securenative-stg.com/collector/api/v1')
11
+
12
+ stub_request(:post, 'https://api.securenative-stg.com/collector/api/v1/track')
13
+ .with(body: { event: 'SOME_EVENT_NAME' }).to_return(status: 200)
14
+ client = SecureNativeHttpClient.new(options)
15
+ payload = '{"event": "SOME_EVENT_NAME"}'
16
+
17
+ res = client.post('track', payload)
18
+
19
+ expect(res.ok).to eq(true)
20
+ expect(res.status_code).to eq(200)
21
+ expect(res.text).to eq(payload)
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'utils/signature_utils'
4
+ require 'rspec'
5
+
6
+ RSpec.describe SignatureUtils do
7
+ it 'verifies request payload' do
8
+ signature = 'c4574c1748064735513697750c6223ff36b03ae3b85b160ce8788557d01e1d9d1c9cd942074323ee0061d3dcc8c94359c5acfa6eee8e2da095b3967b1a88ab73'
9
+ payload = '{"id":"4a9157ffbd18cfbd73a57298","type":"security-action","flow":{"id":"62298c73a9bb433fbd1f75984a9157fd","name":"Block user that violates geo velocity"},"userId":"73a9bb433fbd1f75984a9157","userTraits":{"name":"John Doe","email":"john.doe@gmail.com"},"request":{"ip":"10.0.0.0","fp":"9bb433fb984a9157d1f7598"},"action":"block","properties":{"type":"customer"},"timestamp":"2020-02-23T22:28:55.387Z"}'
10
+ secret_key = 'B00C42DAD33EAC6F6572DA756EA4915349C0A4F6'
11
+
12
+ expect(SignatureUtils.valid_signature?(secret_key, payload, signature)).to be_truthy
13
+ end
14
+
15
+ it 'verifies request empty signature' do
16
+ expect(SignatureUtils.valid_signature?('', '', 'B00C42DAD33EAC6F6572DA756EA4915349C0A4F6')).to be_falsey
17
+ end
18
+ end
@@ -1,10 +1,10 @@
1
1
  lib = File.expand_path("lib", __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require_relative "lib/securenative/utils/version_utils"
3
+ require_relative "lib/utils/version_utils"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "securenative"
7
- spec.version = VersionUtils.version
7
+ spec.version = "0.1.22"
8
8
  spec.authors = ["SecureNative"]
9
9
  spec.email = ["support@securenative.com"]
10
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: securenative
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.1.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - SecureNative
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-23 00:00:00.000000000 Z
11
+ date: 2020-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -51,54 +51,99 @@ files:
51
51
  - ".gitignore"
52
52
  - ".rakeTasks"
53
53
  - ".rspec"
54
- - ".travis.yml"
55
54
  - Gemfile
56
55
  - Gemfile.lock
57
56
  - LICENSE
58
57
  - README.md
59
58
  - Rakefile
60
- - VERSION
61
59
  - bin/console
62
60
  - bin/setup
63
- - lib/securenative/api_manager.rb
64
- - lib/securenative/config/configuration_builder.rb
65
- - lib/securenative/config/configuration_manager.rb
66
- - lib/securenative/config/securenative_options.rb
67
- - lib/securenative/context/context_builder.rb
68
- - lib/securenative/context/securenative_context.rb
69
- - lib/securenative/enums/api_route.rb
70
- - lib/securenative/enums/event_types.rb
71
- - lib/securenative/enums/failover_strategy.rb
72
- - lib/securenative/enums/risk_level.rb
73
- - lib/securenative/event_manager.rb
74
- - lib/securenative/event_options_builder.rb
75
- - lib/securenative/exceptions/securenative_config_exception.rb
76
- - lib/securenative/exceptions/securenative_http_exception.rb
77
- - lib/securenative/exceptions/securenative_invalid_options_exception.rb
78
- - lib/securenative/exceptions/securenative_invalid_uri_exception.rb
79
- - lib/securenative/exceptions/securenative_parse_exception.rb
80
- - lib/securenative/exceptions/securenative_sdk_Illegal_state_exception.rb
81
- - lib/securenative/exceptions/securenative_sdk_exception.rb
82
- - lib/securenative/http/http_response.rb
83
- - lib/securenative/http/securenative_http_client.rb
84
- - lib/securenative/logger.rb
85
- - lib/securenative/models/client_token.rb
86
- - lib/securenative/models/device.rb
87
- - lib/securenative/models/event_options.rb
88
- - lib/securenative/models/request_context.rb
89
- - lib/securenative/models/request_options.rb
90
- - lib/securenative/models/sdk_event.rb
91
- - lib/securenative/models/user_traits.rb
92
- - lib/securenative/models/verify_result.rb
93
- - lib/securenative/securenative.iml
94
- - lib/securenative/securenative.rb
95
- - lib/securenative/utils/date_utils.rb
96
- - lib/securenative/utils/encryption_utils.rb
97
- - lib/securenative/utils/ip_utils.rb
98
- - lib/securenative/utils/request_utils.rb
99
- - lib/securenative/utils/signature_utils.rb
100
- - lib/securenative/utils/utils.rb
101
- - lib/securenative/utils/version_utils.rb
61
+ - lib/api_manager.rb
62
+ - lib/config/configuration_builder.rb
63
+ - lib/config/configuration_manager.rb
64
+ - lib/config/securenative_options.rb
65
+ - lib/context/hanami_context.rb
66
+ - lib/context/rails_context.rb
67
+ - lib/context/securenative_context.rb
68
+ - lib/context/sinatra_context.rb
69
+ - lib/enums/api_route.rb
70
+ - lib/enums/event_types.rb
71
+ - lib/enums/failover_strategy.rb
72
+ - lib/enums/risk_level.rb
73
+ - lib/errors/securenative_config_error.rb
74
+ - lib/errors/securenative_http_error.rb
75
+ - lib/errors/securenative_invalid_options_error.rb
76
+ - lib/errors/securenative_invalid_uri_error.rb
77
+ - lib/errors/securenative_parse_error.rb
78
+ - lib/errors/securenative_sdk_Illegal_state_error.rb
79
+ - lib/errors/securenative_sdk_error.rb
80
+ - lib/event_manager.rb
81
+ - lib/http/secure_native_http_response.rb
82
+ - lib/http/securenative_http_client.rb
83
+ - lib/models/client_token.rb
84
+ - lib/models/device.rb
85
+ - lib/models/event_options.rb
86
+ - lib/models/request_context.rb
87
+ - lib/models/request_options.rb
88
+ - lib/models/sdk_event.rb
89
+ - lib/models/user_traits.rb
90
+ - lib/models/verify_result.rb
91
+ - lib/securenative.rb
92
+ - lib/utils/date_utils.rb
93
+ - lib/utils/encryption_utils.rb
94
+ - lib/utils/ip_utils.rb
95
+ - lib/utils/request_utils.rb
96
+ - lib/utils/secure_native_logger.rb
97
+ - lib/utils/signature_utils.rb
98
+ - lib/utils/utils.rb
99
+ - lib/utils/version_utils.rb
100
+ - out/production/securenative-ruby/api_manager.rb
101
+ - out/production/securenative-ruby/config/configuration_builder.rb
102
+ - out/production/securenative-ruby/config/configuration_manager.rb
103
+ - out/production/securenative-ruby/config/securenative_options.rb
104
+ - out/production/securenative-ruby/context/securenative_context.rb
105
+ - out/production/securenative-ruby/enums/api_route.rb
106
+ - out/production/securenative-ruby/enums/event_types.rb
107
+ - out/production/securenative-ruby/enums/failover_strategy.rb
108
+ - out/production/securenative-ruby/enums/risk_level.rb
109
+ - out/production/securenative-ruby/errors/securenative_config_error.rb
110
+ - out/production/securenative-ruby/errors/securenative_http_error.rb
111
+ - out/production/securenative-ruby/errors/securenative_invalid_options_error.rb
112
+ - out/production/securenative-ruby/errors/securenative_invalid_uri_error.rb
113
+ - out/production/securenative-ruby/errors/securenative_parse_error.rb
114
+ - out/production/securenative-ruby/errors/securenative_sdk_Illegal_state_error.rb
115
+ - out/production/securenative-ruby/errors/securenative_sdk_error.rb
116
+ - out/production/securenative-ruby/event_manager.rb
117
+ - out/production/securenative-ruby/event_options.rb
118
+ - out/production/securenative-ruby/http/http_response.rb
119
+ - out/production/securenative-ruby/http/securenative_http_client.rb
120
+ - out/production/securenative-ruby/models/client_token.rb
121
+ - out/production/securenative-ruby/models/device.rb
122
+ - out/production/securenative-ruby/models/event_options.rb
123
+ - out/production/securenative-ruby/models/request_context.rb
124
+ - out/production/securenative-ruby/models/request_options.rb
125
+ - out/production/securenative-ruby/models/sdk_event.rb
126
+ - out/production/securenative-ruby/models/user_traits.rb
127
+ - out/production/securenative-ruby/models/verify_result.rb
128
+ - out/production/securenative-ruby/securenative.rb
129
+ - out/production/securenative-ruby/utils/date_utils.rb
130
+ - out/production/securenative-ruby/utils/encryption_utils.rb
131
+ - out/production/securenative-ruby/utils/ip_utils.rb
132
+ - out/production/securenative-ruby/utils/request_utils.rb
133
+ - out/production/securenative-ruby/utils/secure_native_logger.rb
134
+ - out/production/securenative-ruby/utils/signature_utils.rb
135
+ - out/production/securenative-ruby/utils/utils.rb
136
+ - out/production/securenative-ruby/utils/version_utils.rb
137
+ - out/test/securenative-ruby/spec_api_manager.rb
138
+ - out/test/securenative-ruby/spec_context_builder.rb
139
+ - out/test/securenative-ruby/spec_date_utils.rb
140
+ - out/test/securenative-ruby/spec_encryption_utils.rb
141
+ - out/test/securenative-ruby/spec_event_manager.rb
142
+ - out/test/securenative-ruby/spec_helper.rb
143
+ - out/test/securenative-ruby/spec_ip_utils.rb
144
+ - out/test/securenative-ruby/spec_securenative.rb
145
+ - out/test/securenative-ruby/spec_securenative_http_client.rb
146
+ - out/test/securenative-ruby/spec_signature_utils.rb
102
147
  - securenative.gemspec
103
148
  homepage: https://www.securenative.com
104
149
  licenses: