perimeter_x 1.2.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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>