securenative 0.1.29 → 0.1.34

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +49 -0
  3. data/.github/workflows/publish.yml +60 -0
  4. data/.github/workflows/test.yml +48 -0
  5. data/.gitignore +40 -0
  6. data/.rakeTasks +7 -0
  7. data/.rspec +3 -0
  8. data/Gemfile +11 -0
  9. data/Gemfile.lock +270 -0
  10. data/LICENSE +21 -0
  11. data/README.md +2 -2
  12. data/Rakefile +6 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/lib/securenative/api_manager.rb +34 -0
  16. data/lib/securenative/client.rb +79 -0
  17. data/lib/securenative/client_token.rb +14 -0
  18. data/lib/securenative/config/configuration_builder.rb +29 -0
  19. data/lib/securenative/config/configuration_manager.rb +57 -0
  20. data/lib/securenative/context.rb +65 -0
  21. data/lib/securenative/device.rb +12 -0
  22. data/lib/securenative/enums/api_route.rb +10 -0
  23. data/lib/securenative/enums/risk_level.rb +11 -0
  24. data/lib/securenative/errors/config_error.rb +4 -0
  25. data/lib/securenative/errors/http_error.rb +4 -0
  26. data/lib/securenative/errors/invalid_options_error.rb +4 -0
  27. data/lib/securenative/errors/invalid_uri_error.rb +6 -0
  28. data/lib/securenative/errors/parse_error.rb +4 -0
  29. data/lib/securenative/errors/sdk_Illegal_state_error.rb +4 -0
  30. data/lib/securenative/errors/sdk_error.rb +4 -0
  31. data/lib/securenative/event_manager.rb +156 -0
  32. data/lib/securenative/event_options.rb +35 -0
  33. data/lib/securenative/event_types.rb +25 -0
  34. data/lib/securenative/failover_strategy.rb +8 -0
  35. data/lib/securenative/frameworks/hanami.rb +49 -0
  36. data/lib/securenative/frameworks/rails.rb +51 -0
  37. data/lib/securenative/frameworks/sinatra.rb +49 -0
  38. data/lib/securenative/http_client.rb +47 -0
  39. data/lib/securenative/http_response.rb +14 -0
  40. data/lib/securenative/options.rb +23 -0
  41. data/lib/securenative/request_context.rb +20 -0
  42. data/lib/securenative/request_options.rb +14 -0
  43. data/lib/securenative/sdk_event.rb +44 -0
  44. data/lib/securenative/user_traits.rb +15 -0
  45. data/lib/securenative/utils/date_utils.rb +13 -0
  46. data/lib/securenative/utils/encryption_utils.rb +48 -0
  47. data/lib/securenative/utils/ip_utils.rb +25 -0
  48. data/lib/securenative/utils/log.rb +46 -0
  49. data/lib/securenative/utils/request_utils.rb +101 -0
  50. data/lib/securenative/utils/signature_utils.rb +18 -0
  51. data/lib/securenative/utils/utils.rb +13 -0
  52. data/lib/securenative/utils/version_utils.rb +15 -0
  53. data/lib/securenative/verify_result.rb +18 -0
  54. data/lib/securenative/version.rb +5 -0
  55. data/securenative.gemspec +33 -0
  56. metadata +56 -3
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
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
9
+
10
+ false
11
+ end
12
+
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?
16
+
17
+ true
18
+ end
19
+
20
+ def self.loop_back?(ip_address)
21
+ IPAddr.new(ip_address).loopback?
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module SecureNative
6
+ class Log
7
+ @logger = Logger.new(STDOUT)
8
+
9
+ def self.init_logger(level = 'DEBUG')
10
+ @logger.level = case level
11
+ when 'WARN'
12
+ Logger::WARN
13
+ when 'DEBUG'
14
+ Logger::DEBUG
15
+ when 'ERROR'
16
+ Logger::ERROR
17
+ when 'FATAL'
18
+ Logger::FATAL
19
+ when 'INFO'
20
+ Logger::INFO
21
+ else
22
+ Logger::FATAL
23
+ end
24
+
25
+ @logger.formatter = proc do |severity, datetime, progname, msg|
26
+ "[#{datetime}] #{severity} (#{progname}): #{msg}\n"
27
+ end
28
+ end
29
+
30
+ def self.info(msg)
31
+ @logger.info(msg)
32
+ end
33
+
34
+ def self.debug(msg)
35
+ @logger.debug(msg)
36
+ end
37
+
38
+ def self.warning(msg)
39
+ @logger.warning(msg)
40
+ end
41
+
42
+ def self.error(msg)
43
+ @logger.error(msg)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Utils
5
+ class RequestUtils
6
+ SECURENATIVE_COOKIE = '_sn'
7
+ SECURENATIVE_HEADER = 'x-securenative'
8
+ PREFIX = 'HTTP_'
9
+
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
16
+ []
17
+ end
18
+
19
+ def self.get_client_ip_from_request(request, options)
20
+ unless options.proxy_headers.nil?
21
+ options.proxy_headers.each { |header|
22
+ begin
23
+ h = request.env[header]
24
+ if h.nil?
25
+ h = request.env[self.parse_ip(header)]
26
+ end
27
+ return h.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless h.nil?
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
38
+ end
39
+ }
40
+ end
41
+
42
+ begin
43
+ x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
44
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
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
52
+ end
53
+
54
+ begin
55
+ x_forwarded_for = request.env['HTTP_X_REAL_IP']
56
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
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
64
+ end
65
+
66
+ begin
67
+ x_forwarded_for = request.env['REMOTE_ADDR']
68
+ return x_forwarded_for.scan(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/)[0] unless x_forwarded_for.nil?
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
82
+ end
83
+
84
+ ''
85
+ end
86
+
87
+ def self.get_remote_ip_from_request(request)
88
+ begin
89
+ request.remote_ip
90
+ rescue NoMethodError
91
+ ''
92
+ end
93
+ end
94
+
95
+ def self.parse_ip(headers)
96
+ h = headers.gsub('-', '_')
97
+ return PREFIX + h.upcase
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Utils
5
+ class SignatureUtils
6
+ SIGNATURE_HEADER = 'x-securenative'
7
+
8
+ def self.valid_signature?(api_key, payload, header_signature)
9
+ key = api_key.encode('utf-8')
10
+ body = payload.encode('utf-8')
11
+ calculated_signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha512'), key, body)
12
+ calculated_signature.eql? header_signature
13
+ rescue StandardError
14
+ false
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Utils
5
+ class Utils
6
+ def self.null_or_empty?(string)
7
+ return true if !string || string.empty? || string.nil?
8
+
9
+ false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ module Utils
5
+ class VersionUtils
6
+ def self.version
7
+ begin
8
+ Gem.loaded_specs['securenative'].version.to_s
9
+ rescue StandardError
10
+ 'unknown'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ class VerifyResult
5
+ attr_reader :risk_level, :score, :triggers
6
+ attr_writer :risk_level, :score, :triggers
7
+
8
+ def initialize(risk_level: nil, score: nil, triggers: nil)
9
+ @risk_level = risk_level
10
+ @score = score
11
+ @triggers = triggers
12
+ end
13
+
14
+ def to_s
15
+ "risk_level: #{@risk_level}, score: #{@score}, triggers: #{@triggers}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SecureNative
4
+ VERSION = '0.1.34'
5
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'securenative'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'securenative'
9
+ spec.version = SecureNative::VERSION
10
+ spec.authors = ['SecureNative']
11
+ spec.email = ['support@securenative.com']
12
+ spec.required_ruby_version = '>= 2.4'
13
+
14
+ spec.summary = 'SecureNative SDK for Ruby'
15
+ spec.homepage = 'https://www.securenative.com'
16
+ spec.license = 'MIT'
17
+
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.test_files = Dir['spec//*']
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ['lib']
30
+
31
+ spec.add_development_dependency 'bundler', '~> 2.0'
32
+ spec.add_development_dependency 'rake', '~> 12.3.3'
33
+ end
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.29
4
+ version: 0.1.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - SecureNative
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-01 00:00:00.000000000 Z
11
+ date: 2020-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -45,8 +45,61 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - ".github/workflows/ci.yml"
49
+ - ".github/workflows/publish.yml"
50
+ - ".github/workflows/test.yml"
51
+ - ".gitignore"
52
+ - ".rakeTasks"
53
+ - ".rspec"
54
+ - Gemfile
55
+ - Gemfile.lock
56
+ - LICENSE
48
57
  - README.md
49
- - lib//securenative.rb
58
+ - Rakefile
59
+ - bin/console
60
+ - bin/setup
61
+ - lib/securenative.rb
62
+ - lib/securenative/api_manager.rb
63
+ - lib/securenative/client.rb
64
+ - lib/securenative/client_token.rb
65
+ - lib/securenative/config/configuration_builder.rb
66
+ - lib/securenative/config/configuration_manager.rb
67
+ - lib/securenative/context.rb
68
+ - lib/securenative/device.rb
69
+ - lib/securenative/enums/api_route.rb
70
+ - lib/securenative/enums/risk_level.rb
71
+ - lib/securenative/errors/config_error.rb
72
+ - lib/securenative/errors/http_error.rb
73
+ - lib/securenative/errors/invalid_options_error.rb
74
+ - lib/securenative/errors/invalid_uri_error.rb
75
+ - lib/securenative/errors/parse_error.rb
76
+ - lib/securenative/errors/sdk_Illegal_state_error.rb
77
+ - lib/securenative/errors/sdk_error.rb
78
+ - lib/securenative/event_manager.rb
79
+ - lib/securenative/event_options.rb
80
+ - lib/securenative/event_types.rb
81
+ - lib/securenative/failover_strategy.rb
82
+ - lib/securenative/frameworks/hanami.rb
83
+ - lib/securenative/frameworks/rails.rb
84
+ - lib/securenative/frameworks/sinatra.rb
85
+ - lib/securenative/http_client.rb
86
+ - lib/securenative/http_response.rb
87
+ - lib/securenative/options.rb
88
+ - lib/securenative/request_context.rb
89
+ - lib/securenative/request_options.rb
90
+ - lib/securenative/sdk_event.rb
91
+ - lib/securenative/user_traits.rb
92
+ - lib/securenative/utils/date_utils.rb
93
+ - lib/securenative/utils/encryption_utils.rb
94
+ - lib/securenative/utils/ip_utils.rb
95
+ - lib/securenative/utils/log.rb
96
+ - lib/securenative/utils/request_utils.rb
97
+ - lib/securenative/utils/signature_utils.rb
98
+ - lib/securenative/utils/utils.rb
99
+ - lib/securenative/utils/version_utils.rb
100
+ - lib/securenative/verify_result.rb
101
+ - lib/securenative/version.rb
102
+ - securenative.gemspec
50
103
  - spec//spec_helper.rb
51
104
  homepage: https://www.securenative.com
52
105
  licenses: