perimeter_x 1.0.6.pre.alpha → 2.0.0

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 (41) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +6 -3
  3. data/.travis.yml +3 -0
  4. data/Dockerfile +19 -41
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +51 -3
  7. data/LICENSE.txt +9 -12
  8. data/Rakefile +10 -2
  9. data/changelog.md +72 -0
  10. data/examples/app/controllers/home_controller.rb +9 -0
  11. data/examples/app/views/home/index.html.erb.dist +20 -0
  12. data/examples/config/initializers/perimeterx.rb.dist +8 -0
  13. data/examples/{routes.rb → config/routes.rb} +0 -0
  14. data/lib/perimeter_x.rb +192 -37
  15. data/lib/perimeterx/configuration.rb +30 -18
  16. data/lib/perimeterx/internal/clients/perimeter_x_activity_client.rb +110 -0
  17. data/lib/perimeterx/internal/clients/perimeter_x_risk_client.rb +28 -0
  18. data/lib/perimeterx/internal/exceptions/px_cookie_decryption_exception.rb +5 -0
  19. data/lib/perimeterx/internal/payload/perimeter_x_cookie_v1.rb +42 -0
  20. data/lib/perimeterx/internal/payload/perimeter_x_cookie_v3.rb +37 -0
  21. data/lib/perimeterx/internal/payload/perimeter_x_payload.rb +148 -0
  22. data/lib/perimeterx/internal/payload/perimeter_x_token_v1.rb +38 -0
  23. data/lib/perimeterx/internal/payload/perimeter_x_token_v3.rb +36 -0
  24. data/lib/perimeterx/internal/perimeter_x_context.rb +112 -53
  25. data/lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb +103 -0
  26. data/lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb +128 -0
  27. data/lib/perimeterx/utils/px_constants.rb +62 -0
  28. data/lib/perimeterx/utils/px_http_client.rb +43 -28
  29. data/lib/perimeterx/utils/px_logger.rb +12 -6
  30. data/lib/perimeterx/utils/px_template_factory.rb +41 -0
  31. data/lib/perimeterx/utils/templates/block_template.mustache +175 -0
  32. data/lib/perimeterx/utils/templates/ratelimit.mustache +9 -0
  33. data/lib/perimeterx/version.rb +2 -2
  34. data/perimeter_x.gemspec +10 -4
  35. data/readme.md +258 -42
  36. metadata +130 -24
  37. data/bin/console +0 -14
  38. data/bin/setup +0 -8
  39. data/examples/home_controller.rb.dist +0 -23
  40. data/lib/perimeterx/internal/perimeter_x_risk_client.rb +0 -29
  41. data/lib/perimeterx/internal/perimeter_x_s2s_validator.rb +0 -67
metadata CHANGED
@@ -1,57 +1,151 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perimeter_x
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6.pre.alpha
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nitzan Goldfeder
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-24 00:00:00.000000000 Z
11
+ date: 2020-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.14'
19
+ version: '2.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.14'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '12.3'
34
34
  type: :development
35
35
  prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '12.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.0.5
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.0.5
61
+ - !ruby/object:Gem::Dependency
62
+ name: typhoeus
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.1'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.1.2
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.1'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.1.2
81
+ - !ruby/object:Gem::Dependency
82
+ name: mustache
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.0'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.0.3
91
+ type: :runtime
92
+ prerelease: false
36
93
  version_requirements: !ruby/object:Gem::Requirement
37
94
  requirements:
38
95
  - - "~>"
39
96
  - !ruby/object:Gem::Version
40
- version: '10.0'
97
+ version: '1.0'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.0.3
41
101
  - !ruby/object:Gem::Dependency
42
- name: httpclient
102
+ name: activesupport
43
103
  requirement: !ruby/object:Gem::Requirement
44
104
  requirements:
45
- - - '='
105
+ - - ">="
46
106
  - !ruby/object:Gem::Version
47
- version: 2.8.2.4
107
+ version: 5.2.4.3
48
108
  type: :runtime
49
109
  prerelease: false
50
110
  version_requirements: !ruby/object:Gem::Requirement
51
111
  requirements:
52
- - - '='
112
+ - - ">="
53
113
  - !ruby/object:Gem::Version
54
- version: 2.8.2.4
114
+ version: 5.2.4.3
115
+ - !ruby/object:Gem::Dependency
116
+ name: rspec
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '3.0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '3.0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: mocha
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '1.2'
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 1.2.1
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.2'
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 1.2.1
55
149
  description: PerimeterX ruby module to monitor and block traffic according to PerimeterX
56
150
  risk score
57
151
  email: nitzan@perimeterx.com
@@ -62,23 +156,36 @@ extra_rdoc_files:
62
156
  - changelog.md
63
157
  files:
64
158
  - ".gitignore"
159
+ - ".travis.yml"
65
160
  - Dockerfile
66
161
  - Gemfile
67
162
  - Gemfile.lock
68
163
  - LICENSE.txt
69
164
  - Rakefile
70
- - bin/console
71
- - bin/setup
72
165
  - changelog.md
73
- - examples/home_controller.rb.dist
74
- - examples/routes.rb
166
+ - examples/app/controllers/home_controller.rb
167
+ - examples/app/views/home/index.html.erb.dist
168
+ - examples/config/initializers/perimeterx.rb.dist
169
+ - examples/config/routes.rb
75
170
  - lib/perimeter_x.rb
76
171
  - lib/perimeterx/configuration.rb
172
+ - lib/perimeterx/internal/clients/perimeter_x_activity_client.rb
173
+ - lib/perimeterx/internal/clients/perimeter_x_risk_client.rb
174
+ - lib/perimeterx/internal/exceptions/px_cookie_decryption_exception.rb
175
+ - lib/perimeterx/internal/payload/perimeter_x_cookie_v1.rb
176
+ - lib/perimeterx/internal/payload/perimeter_x_cookie_v3.rb
177
+ - lib/perimeterx/internal/payload/perimeter_x_payload.rb
178
+ - lib/perimeterx/internal/payload/perimeter_x_token_v1.rb
179
+ - lib/perimeterx/internal/payload/perimeter_x_token_v3.rb
77
180
  - lib/perimeterx/internal/perimeter_x_context.rb
78
- - lib/perimeterx/internal/perimeter_x_risk_client.rb
79
- - lib/perimeterx/internal/perimeter_x_s2s_validator.rb
181
+ - lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb
182
+ - lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb
183
+ - lib/perimeterx/utils/px_constants.rb
80
184
  - lib/perimeterx/utils/px_http_client.rb
81
185
  - lib/perimeterx/utils/px_logger.rb
186
+ - lib/perimeterx/utils/px_template_factory.rb
187
+ - lib/perimeterx/utils/templates/block_template.mustache
188
+ - lib/perimeterx/utils/templates/ratelimit.mustache
82
189
  - lib/perimeterx/version.rb
83
190
  - perimeter_x.gemspec
84
191
  - readme.md
@@ -101,12 +208,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
208
  version: '2.3'
102
209
  required_rubygems_version: !ruby/object:Gem::Requirement
103
210
  requirements:
104
- - - ">"
211
+ - - ">="
105
212
  - !ruby/object:Gem::Version
106
- version: 1.3.1
213
+ version: '0'
107
214
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.4.6
215
+ rubygems_version: 3.0.3
110
216
  signing_key:
111
217
  specification_version: 4
112
218
  summary: PerimeterX ruby implmentation
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "perimeter_x"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,23 +0,0 @@
1
- class HomeController < ApplicationController
2
- include PerimeterX
3
-
4
- before_action :px_middleware
5
-
6
- attr_accessor :px
7
-
8
- def initialize()
9
- params = {
10
- "app_id" => <APP_ID>,
11
- "cookie_key" => <COOKIE_KEY>,
12
- "auth_token" => <AUTH_TOKEN>
13
- }
14
- @px = PxModule.instance(params)
15
- end
16
-
17
- def index
18
- end
19
-
20
- def px_middleware
21
- px.px_verify(request.env)
22
- end
23
- end
@@ -1,29 +0,0 @@
1
- require 'perimeterx/utils/px_logger'
2
-
3
- class PerimeterxRiskClient
4
- L = PxLogger.instance
5
-
6
- attr_accessor :px_ctx
7
- attr_accessor :px_config
8
- attr_accessor :http_client
9
-
10
- def initialize(px_ctx, px_config, http_client)
11
- @px_ctx = px_ctx
12
- @px_config = px_config
13
- @http_client = http_client;
14
- end
15
-
16
- def format_headers()
17
- formated_headers = []
18
- @px_ctx.context[:headers].each do |k,v|
19
- if (!@px_config["sensitive_headers"].include? k.to_s)
20
- formated_headers.push({
21
- :name => k.to_s,
22
- :value => v
23
- })
24
- end #end if
25
- end #end forech
26
- return formated_headers
27
- end #end method
28
-
29
- end #end class
@@ -1,67 +0,0 @@
1
- require 'perimeterx/internal/perimeter_x_risk_client'
2
-
3
- class PerimeterxS2SValidator < PerimeterxRiskClient
4
-
5
- attr_accessor :risk_mode
6
- attr_accessor :response
7
-
8
- def initialize(px_ctx, px_config, http_client)
9
- L.info("PerimeterxS2SValidator: initialize")
10
- @px_ctx = px_ctx
11
- @px_config = px_config
12
- @http_client = http_client
13
- end
14
-
15
- def send_risk_request
16
- L.info("PerimeterxS2SValidator[send_risk_request]: send_risk_request")
17
- request_body = {
18
- 'request' => {
19
- 'ip' => @px_ctx.context[:ip],
20
- 'headers' => format_headers(),
21
- 'url' => @px_ctx.context[:full_url]
22
- },
23
- 'additional' => {
24
- 's2s_call_reason' => @px_ctx.context[:s2s_call_reason],
25
- 'module_version' => @px_config["sdk_name"],
26
- 'http_method' => @px_ctx.context[:http_method],
27
- 'http_version' => @px_ctx.context[:http_version],
28
- }
29
- }
30
-
31
- headers = {
32
- "Authorization" => "Bearer #{@px_config['auth_token']}" ,
33
- "Content-Type" => "application/json"
34
- };
35
-
36
- return @http_client.post("/api/v2/risk", request_body, headers)
37
- end
38
-
39
- def verify
40
- L.info("PerimeterxS2SValidator[verify]: started")
41
- response = send_risk_request()
42
- if (!response)
43
- return @px_ctx
44
- end
45
- @px_ctx.context[:made_s2s_risk_api_call] = true
46
- response_body = eval(response.content);
47
- # When success
48
- if (response.status == 200 && response_body.key?(:score) && response_body.key?(:action))
49
- L.info("PerimeterxS2SValidator[verify]: response ok")
50
- score = response_body[:score]
51
- @px_ctx.context[:score] = score
52
- @px_ctx.context[:uuid] = response_body[:uuid]
53
- @px_ctx.context[:block_action] = response_body[:action]
54
- end #end success response
55
-
56
- # When error
57
- if(response.status != 200)
58
- L.warn("PerimeterxS2SValidator[verify]: bad response, return code #{response.code}")
59
- @px_ctx.context[:uuid] = ""
60
- @px_ctx.context[:s2s_error_msg] = response_body[:message]
61
- end
62
-
63
- L.info("PerimeterxS2SValidator[verify]: done")
64
- return @px_ctx
65
- end #end method
66
-
67
- end