perimeter_x 1.2.0 → 2.2.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 (34) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -0
  4. data/Dockerfile +12 -7
  5. data/Gemfile.lock +36 -30
  6. data/Rakefile +1 -0
  7. data/changelog.md +58 -0
  8. data/examples/app/controllers/home_controller.rb +1 -1
  9. data/lib/perimeter_x.rb +195 -71
  10. data/lib/perimeterx/configuration.rb +74 -22
  11. data/lib/perimeterx/internal/clients/perimeter_x_activity_client.rb +32 -6
  12. data/lib/perimeterx/internal/exceptions/px_config_exception.rb +6 -0
  13. data/lib/perimeterx/internal/first_party/px_first_party.rb +124 -0
  14. data/lib/perimeterx/internal/{perimeter_x_cookie_v1.rb → payload/perimeter_x_cookie_v1.rb} +1 -1
  15. data/lib/perimeterx/internal/{perimeter_x_cookie_v3.rb → payload/perimeter_x_cookie_v3.rb} +1 -1
  16. data/lib/perimeterx/internal/{perimeter_x_cookie.rb → payload/perimeter_x_payload.rb} +12 -4
  17. data/lib/perimeterx/internal/payload/perimeter_x_token_v1.rb +38 -0
  18. data/lib/perimeterx/internal/payload/perimeter_x_token_v3.rb +36 -0
  19. data/lib/perimeterx/internal/perimeter_x_context.rb +74 -32
  20. data/lib/perimeterx/internal/validators/hash_schema_validator.rb +26 -0
  21. data/lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb +29 -21
  22. data/lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb +33 -9
  23. data/lib/perimeterx/utils/px_constants.rb +35 -17
  24. data/lib/perimeterx/utils/px_http_client.rb +60 -3
  25. data/lib/perimeterx/utils/px_template_factory.rb +18 -8
  26. data/lib/perimeterx/utils/templates/block_template.mustache +175 -0
  27. data/lib/perimeterx/utils/templates/ratelimit.mustache +9 -0
  28. data/lib/perimeterx/version.rb +1 -1
  29. data/perimeter_x.gemspec +3 -3
  30. data/readme.md +115 -31
  31. metadata +24 -20
  32. data/lib/perimeterx/internal/validators/perimeter_x_captcha_validator.rb +0 -65
  33. data/lib/perimeterx/utils/templates/block.mustache +0 -146
  34. data/lib/perimeterx/utils/templates/captcha.mustache +0 -185
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perimeter_x
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.2.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-06-07 00:00:00.000000000 Z
11
+ date: 2020-09-15 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
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '12.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: concurrent-ruby
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -104,14 +104,14 @@ dependencies:
104
104
  requirements:
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 4.2.0
107
+ version: 5.2.4.3
108
108
  type: :runtime
109
109
  prerelease: false
110
110
  version_requirements: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
- version: 4.2.0
114
+ version: 5.2.4.3
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: rspec
117
117
  requirement: !ruby/object:Gem::Requirement
@@ -156,6 +156,7 @@ extra_rdoc_files:
156
156
  - changelog.md
157
157
  files:
158
158
  - ".gitignore"
159
+ - ".travis.yml"
159
160
  - Dockerfile
160
161
  - Gemfile
161
162
  - Gemfile.lock
@@ -170,20 +171,24 @@ files:
170
171
  - lib/perimeterx/configuration.rb
171
172
  - lib/perimeterx/internal/clients/perimeter_x_activity_client.rb
172
173
  - lib/perimeterx/internal/clients/perimeter_x_risk_client.rb
174
+ - lib/perimeterx/internal/exceptions/px_config_exception.rb
173
175
  - lib/perimeterx/internal/exceptions/px_cookie_decryption_exception.rb
176
+ - lib/perimeterx/internal/first_party/px_first_party.rb
177
+ - lib/perimeterx/internal/payload/perimeter_x_cookie_v1.rb
178
+ - lib/perimeterx/internal/payload/perimeter_x_cookie_v3.rb
179
+ - lib/perimeterx/internal/payload/perimeter_x_payload.rb
180
+ - lib/perimeterx/internal/payload/perimeter_x_token_v1.rb
181
+ - lib/perimeterx/internal/payload/perimeter_x_token_v3.rb
174
182
  - lib/perimeterx/internal/perimeter_x_context.rb
175
- - lib/perimeterx/internal/perimeter_x_cookie.rb
176
- - lib/perimeterx/internal/perimeter_x_cookie_v1.rb
177
- - lib/perimeterx/internal/perimeter_x_cookie_v3.rb
178
- - lib/perimeterx/internal/validators/perimeter_x_captcha_validator.rb
183
+ - lib/perimeterx/internal/validators/hash_schema_validator.rb
179
184
  - lib/perimeterx/internal/validators/perimeter_x_cookie_validator.rb
180
185
  - lib/perimeterx/internal/validators/perimeter_x_s2s_validator.rb
181
186
  - lib/perimeterx/utils/px_constants.rb
182
187
  - lib/perimeterx/utils/px_http_client.rb
183
188
  - lib/perimeterx/utils/px_logger.rb
184
189
  - lib/perimeterx/utils/px_template_factory.rb
185
- - lib/perimeterx/utils/templates/block.mustache
186
- - lib/perimeterx/utils/templates/captcha.mustache
190
+ - lib/perimeterx/utils/templates/block_template.mustache
191
+ - lib/perimeterx/utils/templates/ratelimit.mustache
187
192
  - lib/perimeterx/version.rb
188
193
  - perimeter_x.gemspec
189
194
  - readme.md
@@ -210,8 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
215
  - !ruby/object:Gem::Version
211
216
  version: '0'
212
217
  requirements: []
213
- rubyforge_project:
214
- rubygems_version: 2.6.11
218
+ rubygems_version: 3.0.3
215
219
  signing_key:
216
220
  specification_version: 4
217
221
  summary: PerimeterX ruby implmentation
@@ -1,65 +0,0 @@
1
- require 'perimeterx/internal/clients/perimeter_x_risk_client'
2
-
3
- module PxModule
4
- class PerimeterxCaptchaValidator < PerimeterxRiskClient
5
-
6
- def initialize(px_config, http_client)
7
- super(px_config, http_client)
8
- end
9
-
10
- def send_captcha_request(vid, uuid, captcha, px_ctx)
11
-
12
- request_body = {
13
- :request => {
14
- :ip => px_ctx.context[:ip],
15
- :headers => format_headers(px_ctx),
16
- :uri => px_ctx.context[:uri]
17
- },
18
- :pxCaptcha => captcha,
19
- :vid => vid,
20
- :uuid => uuid,
21
- :hostname => px_ctx.context[:hostname]
22
- }
23
-
24
- # Prepare request
25
- headers = {
26
- "Authorization" => "Bearer #{@px_config[:auth_token]}" ,
27
- "Content-Type" => "application/json"
28
- };
29
-
30
- return @http_client.post(PxModule::API_V1_CAPTCHA, request_body, headers, @px_config[:api_timeout], @px_config[:api_timeout_connection])
31
-
32
- end
33
-
34
- def verify(px_ctx)
35
- captcha_validated = false
36
- begin
37
- if(!px_ctx.context.key?(:px_captcha))
38
- return captcha_validated, px_ctx
39
- end
40
- captcha, vid, uuid = px_ctx.context[:px_captcha].split(':', 3)
41
- if captcha.nil? || vid.nil? || uuid.nil?
42
- return captcha_validated, px_ctx
43
- end
44
-
45
- px_ctx.context[:vid] = vid
46
- px_ctx.context[:uuid] = uuid
47
- response = send_captcha_request(vid, uuid, captcha, px_ctx)
48
-
49
- if (response.status_code == 200)
50
- response_body = eval(response.body)
51
- if ( response_body[:status] == 0 )
52
- captcha_validated = true
53
- end
54
- end
55
-
56
- return captcha_validated, px_ctx
57
-
58
- rescue Exception => e
59
- @logger.error("PerimeterxCaptchaValidator[verify]: failed, returning false")
60
- return captcha_validated, px_ctx
61
- end
62
- end
63
-
64
- end
65
- end
@@ -1,146 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Access to this page has been denied.</title>
7
- <link href="https://fonts.googleapis.com/css?family=Open+Sans:300" rel="stylesheet">
8
- <style>
9
- html,body{
10
- margin: 0;
11
- padding: 0;
12
- font-family: 'Open Sans', sans-serif;
13
- color: #000;
14
- }
15
-
16
- a{
17
- color: #c5c5c5;
18
- text-decoration: none;
19
- }
20
-
21
- .container{
22
- align-items: center;
23
- display: flex;
24
- flex: 1;
25
- justify-content: space-between;
26
- flex-direction: column;
27
- height: 100%;
28
- }
29
-
30
- .container > div {
31
- width: 100%;
32
- display: flex;
33
- justify-content:center;
34
- }
35
-
36
- .container > div > div {
37
- display: flex;
38
- width: 80%;
39
- }
40
-
41
- .customer-logo-wrapper{
42
- padding-top: 2rem;
43
- flex-grow: 0;
44
- background-color: #fff;
45
- visibility: {{logoVisibility}};
46
- }
47
-
48
- .customer-logo{
49
- border-bottom: 1px solid #000;
50
- }
51
-
52
- .customer-logo > img{
53
- padding-bottom: 1rem;
54
- max-height: 50px;
55
- max-width: auto;
56
- }
57
-
58
- .page-title-wrapper{
59
- flex-grow: 2;
60
- }
61
- .page-title {
62
- flex-direction: column-reverse;
63
- }
64
-
65
- .content-wrapper{
66
- flex-grow: 5;
67
- }
68
- .content{
69
- flex-direction: column;
70
- }
71
-
72
- .page-footer-wrapper{
73
- align-items: center;
74
- flex-grow: 0.2;
75
- background-color: #000;
76
- color: #c5c5c5;
77
- font-size: 70%;
78
- }
79
- @media (min-width:768px){
80
- html,body{
81
- height: 100%;
82
- }
83
- }
84
- </style>
85
- <!-- Custom CSS -->
86
- {{# cssRef }}
87
- <link rel="stylesheet" type="text/css" href="{{cssRef}}" />
88
- {{/ cssRef }}
89
- </head>
90
- <body>
91
- <section class="container">
92
- <div class="customer-logo-wrapper">
93
- <div class="customer-logo">
94
- <img src="{{customLogo}}" alt="Logo"/>
95
- </div>
96
- </div>
97
- <div class="page-title-wrapper">
98
- <div class="page-title">
99
- <h1>Access to this page has been denied.</h1>
100
- </div>
101
- </div>
102
- <div class="content-wrapper">
103
- <div class="content">
104
- <p>
105
- You have been blocked because we believe you are using automation tools to browse the website.
106
- </p>
107
- <p>
108
- Please note that Javascript and Cookies must be enabled on your browser to access the website.
109
- </p>
110
- <p>
111
- If you think you have been blocked by mistake, please contact the website administrator with the reference ID below.
112
- </p>
113
- <p>
114
- Reference ID: #{{refId}}
115
- </p>
116
- </div>
117
- </div>
118
- <div class="page-footer-wrapper">
119
- <div class="page-footer">
120
- <p>
121
- Powered by
122
- <a href="https://www.perimeterx.com">PerimeterX</a>
123
- , Inc.
124
- </p>
125
- </div>
126
- </div>
127
- </section>
128
- <!-- Px -->
129
- <script>
130
- (
131
- function (){
132
- window._pxAppId = '{{appId}}';
133
- var p = document.getElementsByTagName("script")[0], s = document.createElement("script");
134
-
135
- s.async = 1;
136
- s.src = '//client.perimeterx.net/{{appId}}/main.min.js';
137
- p.parentNode.insertBefore(s, p);
138
- } ()
139
- );
140
- </script>
141
- <!-- Custom Script -->
142
- {{# jsRef }}
143
- <script src="{{jsRef}}"></script>
144
- {{/ jsRef }}
145
- </body>
146
- </html>
@@ -1,185 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Access to this page has been denied.</title>
7
- <link href="https://fonts.googleapis.com/css?family=Open+Sans:300" rel="stylesheet">
8
- <style>
9
- html,body{
10
- margin: 0;
11
- padding: 0;
12
- font-family: 'Open Sans', sans-serif;
13
- color: #000;
14
- }
15
-
16
- a{
17
- color: #c5c5c5;
18
- text-decoration: none;
19
- }
20
-
21
- .container{
22
- align-items: center;
23
- display: flex;
24
- flex: 1;
25
- justify-content: space-between;
26
- flex-direction: column;
27
- height: 100%;
28
- }
29
-
30
- .container > div {
31
- width: 100%;
32
- display: flex;
33
- justify-content:center;
34
- }
35
-
36
- .container > div > div {
37
- display: flex;
38
- width: 80%;
39
- }
40
-
41
- .customer-logo-wrapper{
42
- padding-top: 2rem;
43
- flex-grow: 0;
44
- background-color: #fff;
45
- visibility: {{logoVisibility}};
46
- }
47
-
48
- .customer-logo{
49
- border-bottom: 1px solid #000;
50
- }
51
-
52
- .customer-logo > img{
53
- padding-bottom: 1rem;
54
- max-height: 50px;
55
- max-width: auto;
56
- }
57
-
58
- .page-title-wrapper{
59
- flex-grow: 2;
60
- }
61
- .page-title {
62
- flex-direction: column-reverse;
63
- }
64
-
65
- .content-wrapper{
66
- flex-grow: 5;
67
- }
68
- .content{
69
- flex-direction: column;
70
- }
71
-
72
- .page-footer-wrapper{
73
- align-items: center;
74
- flex-grow: 0.2;
75
- background-color: #000;
76
- color: #c5c5c5;
77
- font-size: 70%;
78
- }
79
-
80
- @media (min-width:768px){
81
- html,body{
82
- height: 100%;
83
- }
84
- }
85
- </style>
86
- <!-- Custom CSS -->
87
- {{#cssRef}}
88
- <link rel="stylesheet" type="text/css" href="{{cssRef}}" />
89
- {{/cssRef}}
90
- <script src="https://www.google.com/recaptcha/api.js" async defer></script>
91
- </head>
92
-
93
- <body>
94
- <section class="container">
95
- <div class="customer-logo-wrapper">
96
- <div class="customer-logo">
97
- <img src="{{customLogo}}" alt="Logo"/>
98
- </div>
99
- </div>
100
- <div class="page-title-wrapper">
101
- <div class="page-title">
102
- <h1>Please verify you are a human</h1>
103
- </div>
104
- </div>
105
- <div class="content-wrapper">
106
- <div class="content">
107
- <p>
108
- Please click "I am not a robot" to continue
109
- </p>
110
- <div class="g-recaptcha" data-sitekey="6Lcj-R8TAAAAABs3FrRPuQhLMbp5QrHsHufzLf7b" data-callback="handleCaptcha" data-theme="dark">
111
- </div>
112
- <p>
113
- Access to this page has been denied because we believe you are using automation tools to browse the website.
114
- </p>
115
- <p>
116
- This may happen as a result of the following:
117
- </p>
118
- <ul>
119
- <li>
120
- Javascript is disabled or blocked by an extension (ad blockers for example)
121
- </li>
122
- <li>
123
- Your browser does not support cookies
124
- </li>
125
- </ul>
126
- <p>
127
- Please make sure that Javascript and cookies are enabled on your browser and that you are not blocking them from loading.
128
- </p>
129
- <p>
130
- Reference ID: #{{refId}}
131
- </p>
132
- </div>
133
- </div>
134
- <div class="page-footer-wrapper">
135
- <div class="page-footer">
136
- <p>
137
- Powered by
138
- <a href="https://www.perimeterx.com">PerimeterX</a>
139
- , Inc.
140
- </p>
141
- </div>
142
- </div>
143
- </section>
144
- <!-- Px -->
145
- <script>
146
- (
147
- function (){
148
- window._pxAppId = '{{appId}}';
149
- var p = document.getElementsByTagName("script")[0], s = document.createElement("script");
150
-
151
- s.async = 1;
152
- s.src = '//client.perimeterx.net/{{appId}}/main.min.js';
153
- p.parentNode.insertBefore(s, p);
154
- } ()
155
- );
156
- </script>
157
- <!-- Captcha -->
158
- <script>
159
- window.px_vid = '{{vid}}';
160
- function handleCaptcha(response){
161
- var vid = '{{vid}}';
162
- var uuid = '{{uuid}}';
163
- var name = "_pxCaptcha";
164
-
165
- var expiryUtc = new Date(Date.now()+1000*10).toUTCString();
166
-
167
- var cookieParts = [
168
- name,
169
- "=",
170
- response+":"+vid+":"+uuid,
171
- "; expires=",
172
- expiryUtc,
173
- "; path=/"
174
- ];
175
-
176
- document.cookie = cookieParts.join("");
177
- location.reload();
178
- }
179
- </script>
180
- <!-- Custom Script -->
181
- {{#jsRef}}
182
- <script src="{{jsRef}}"></script>
183
- {{/jsRef}}
184
- </body>
185
- </html>